队列的操作原理是先进先出,后进后出;队列也是一种运算受限的线性表,从队列的头部出列,从队列的尾部入列。
队列基本用法:
empty():如果队列为空返回true,否则返回false
size():返回队列中元素的个数
pop():删除队列首元素但不返回其值
front():返回队首元素的值,但不删除该元素
push(x) :在队尾压入新元素 ,x为要压入的元素
back() :返回队列尾元素的值,但不删除该元素
用数组实现的队列叫做顺序队列
template<class T> class MyArrayQueue { public: MyArrayQueue(); ~MyArrayQueue(); bool empty() const; int size() const; void pop(); T front() const; T back() const; void push(T const&); protected: int nHead; int nTail; int nQueueSize; int* pQueue; private: }; template<class T> MyArrayQueue<T>::MyArrayQueue() { nHead = 0; nTail = 0; nQueueSize = 2; pQueue = new T[nQueueSize]; } template<class T> MyArrayQueue<T>::~MyArrayQueue() { delete[] pQueue; } template<class T> bool MyArrayQueue<T>::empty() const { if(nHead == nTail) { return true; } return false; } template<class T> int MyArrayQueue<T>::size() const { return (nTail - nHead); } template<class T> void MyArrayQueue<T>::pop() { if(nHead == nTail) return ; if((nQueueSize / 2) > (nTail - nHead)) { nQueueSize = nQueueSize / 2; T* pTmpArray = new T[nQueueSize]; memcpy(pTmpArray, pQueue+nHead, (nTail - nHead) * sizeof(T)); delete[] pQueue; pQueue = pTmpArray; nTail = nTail - nHead; nHead = 0; } nHead++; } template<class T> T MyArrayQueue<T>::front() const { return pQueue[nHead]; } template<class T> T MyArrayQueue<T>::back() const { return pQueue[nTail-1]; } template<class T> void MyArrayQueue<T>::push(T const& param) { if(nTail == (nQueueSize - 1)) { if(nHead == 0) nQueueSize = nQueueSize * 2; T* pTmpArray = new T[nQueueSize]; memcpy(pTmpArray, pQueue+nHead, (nTail - nHead) * sizeof(T)); delete[] pQueue; pQueue = pTmpArray; nTail = nTail - nHead; nHead = 0; } pQueue[nTail] = param; }
用链表实现的队列叫做链式队列
template<class T> struct Node { T nNum; Node<T>* pNext; Node() { pNext = NULL; } }; template<class T> class MyListQueue { public: MyListQueue(); ~MyListQueue(); bool empty() const; int size() const; void pop(); T front() const; T back() const; void push(T const&); protected: Node<T>* pHead; Node<T>* pTail; private: }; template<class T> MyListQueue<T>::MyListQueue() { pHead = NULL; pTail = NULL; } template<class T> MyListQueue<T>::~MyListQueue() { while(pHead != NULL) { Node<T> *pTmp = pHead->pNext; delete pHead; pHead = pTmp; } pTail = NULL; pHead = NULL; } template<class T> bool MyListQueue<T>::empty() const { if(pHead == NULL) return true; return false; } template<class T> int MyListQueue<T>::size() const { Node<T>* pTmp = pHead; int nSize = 0; while(pTmp != NULL) { pTmp = pTmp->pNext; nSize++; } return nSize; } template<class T> void MyListQueue<T>::pop() { if(pHead == NULL) return ; Node<T>* pTmp = pHead->pNext; delete[] pHead; pHead = pTmp; } template<class T> T MyListQueue<T>::front() const{ if(pHead == NULL) return NULL; return pHead->nNum; } template<class T> T MyListQueue<T>::back() const{ if(pTail == NULL) return NULL; return pTail->nNum; } template<class T> void MyListQueue<T>::push(T const& param) { Node<T>* pTmp = new Node<T>; pTmp->nNum = param; pTmp->pNext = NULL; if(pHead == NULL) { pHead = pTmp; pTail = pTmp; } else { pTail->pNext = pTmp; pTail = pTmp; } }
可关注公众号了解更多的面试技巧