【C++】模擬實現佇列
阿新 • • 發佈:2019-01-29
一、佇列簡介
佇列是一種只允許在一段進行插入,另外一段進行刪除的特殊線性表,允許刪除操作的一端稱為隊頭,允許插入操作的一端稱為隊尾。
佇列又被稱為先進先出的線性表。
與棧類似,佇列也有兩種儲存結構,一種是順序儲存,一種是鏈式儲存,前面一種稱為順序佇列,後面一種稱為鏈隊。
此處要注意順序佇列的溢位現象:
(1)“下溢”現象:當佇列為空時,做出佇列的運算產生的溢位現象。(“下溢”是正常現象,常作為程式的控制轉移條件)
(2)“真上溢”現象:當佇列為滿時,做進佇列運算產生的空間溢位現象。
(3)“假上溢”現象:由於入佇列和出佇列並不是元素向前移動,而是指標在移動阿德,我們向佇列裡刪除一個元素,加入一個元素,兩個指標會不斷的向前移動,直至佇列所在的向量空間的尾部,這時再入佇列,尾指標就跑到向量空間外面,儘管向量空間為空,佇列也為空,卻還是產生了溢位的現象,這便是“假溢位”現象。
注意:針對假溢位現象,我們便採用迴圈佇列的方法處理這樣的情況。
二、佇列支援的操作
(1)佇列初始化(InitQueue)
(2)入隊操作(PushQueue)
(3)出隊操作(PopQueue)
(4)讀取隊頭元素(FrontQueue)
(5)判斷佇列是否為空(EmptyQueue)
三、佇列的實現
#include <iostream> #include <assert.h> using namespace std; template <class T> struct QueueNode { T _data; QueueNode<T>* _next; QueueNode(const T& data) :_data(data) ,_next(next) {} }; template <class T> class Queue { typedef QueueNode<T> Node; public: Queue() :_Front(NULL) ,_Real(NULL) {} ~Queue() { Node* cur = _Front; while (cur) { Node* del = cur; cur = cur->_next; delete cur; } } void Push(const T& data) { if (_Front != NULL) { Node temp = new Node(data); _Real->_next = temp; _Real = _Real->_next; } else { _Front = new Node(data); _Real = _Front; } } bool Pop() { if (Empty()) { cout << "Queue is empty!!!" << endl; return false; } else { Node* del = _Front; _Front = _Front->_next; delete del; del = NULL; } } bool Empty() { if (_Front == NULL) return true; return false; } T& FrontQueue() { assert(_Front != NULL); return _Front->_data; } private: Node* _Front; Node* _Real; };