佇列——順序儲存結構及其基本運算(迴圈佇列)
阿新 • • 發佈:2019-01-07
該文章主要介紹迴圈佇列的順序儲存結構以及相關運算。
標頭檔案:CSqQueue.h
template <typename T> class SqQueueClass1 //迴圈佇列類模板 { T *data; //存放隊中元素 int front, rear; //隊頭和隊尾指標 public: //================迴圈隊基本運算演算法========================== SqQueueClass1(); //建構函式 ~SqQueueClass1(); //解構函式 bool QueueEmpty1(); //判斷佇列是否為空 bool enQueue1(T e); //進佇列演算法 bool deQueue1(T &e); //出佇列演算法 //================迴圈隊其他運算演算法========================= template <typename C> friend void Display(SqQueueClass1<C> &qu); //從隊頭到隊尾輸出隊中所有元素 template <typename C> friend int GetCount(SqQueueClass1<C> &qu); //返回隊中元素個數 template <typename C> friend bool enQueuek(SqQueueClass1<C> &qu, int k, C e); //進隊第k個元素e template <typename C> friend bool deQueuek(SqQueueClass1<C> &qu, int k, C &e); //出隊第k個元素e };
原始檔:CSqQueue.cpp
#include <iostream> #include "CSqQueue.h" const int MaxSize = 100; //================迴圈隊基本運算演算法========================== template <typename T> SqQueueClass1<T>::SqQueueClass1() //建構函式 { data = new T[MaxSize]; front = rear = 0; } template <typename T> SqQueueClass1<T>::~SqQueueClass1() //解構函式 { delete[] data; } template <typename T> bool SqQueueClass1<T>::QueueEmpty1() //判斷佇列是否為空 { return (front == rear); } template <typename T> bool SqQueueClass1<T>::enQueue1(T e) //進佇列演算法 { if ((rear + 1) % MaxSize == front) return false; rear = (rear + 1) % MaxSize; data[rear] = e; return true; } template <typename T> bool SqQueueClass1<T>::deQueue1(T &e) //出佇列演算法 { if (front == rear) return false; front = (front + 1) % MaxSize; e = data[front]; return true; } //================迴圈隊基本其他運算演算法======================== template <typename T> void Display(SqQueueClass1<T> &qu) //從隊頭到隊尾輸出隊中所有元素 { int i = qu.front; while (i != qu.rear) { i = (i + 1) % MaxSize; cout << qu.data[i] << " "; } cout << endl; } template <typename T> int GetCount(SqQueueClass1<T> &qu) //返回隊中元素個數 { return ((qu.rear - qu.front + MaxSize) % MaxSize); } template <typename T> bool enQueuek(SqQueueClass1<T> &qu, int k, T e) //進隊第k個元素e { T x; int i = 1, n = GetCount(qu); if (k<1 || k>n + 1) return false; if (k <= n) for (i = 1; i <= n; i++) { if (i == k) qu.enQueue1(e); qu.deQueue1(x); qu.enQueue1(x); } else qu.enQueue1(e); //k=n+1時直接進隊e return true; } template <typename T> bool deQueuek(SqQueueClass1<T> &qu, int k, T &e) //出隊第k個元素e { T x; int i = 1, n = GetCount(qu); if (k<1 || k>n) return false; for (i = 1; i <= n; i++) { qu.deQueue1(x); if (i != k) qu.enQueue1(x); else e = x; } return true; }
主函式:main.cpp
#include<iostream> #include"CSqQueue.cpp" using namespace std; //=================迴圈隊基本運算演算法==================== void main1() { SqQueueClass1<char> sq; //定義一個字元順序隊sq char e; cout << "建立一個空隊sq\n"; cout << "隊sq" << (sq.QueueEmpty1()?"空":"不空") << endl; cout << "元素a進隊\n"; sq.enQueue1('a'); cout << "元素b進隊\n"; sq.enQueue1('b'); cout << "元素c進隊\n"; sq.enQueue1('c'); cout << "元素d進隊\n"; sq.enQueue1('d'); cout << "元素e進隊\n"; sq.enQueue1('e'); cout << "隊sq" << (sq.QueueEmpty1()?"空":"不空") << endl; cout << "所有元素出隊次序:"; while (!sq.QueueEmpty1()) //隊不空迴圈 { sq.deQueue1(e); //出隊元素e cout << e << " "; //輸出元素e } cout << endl; cout << "銷燬隊sq" << endl; } //==================迴圈隊基本其他運算演算法===================== void main() { SqQueueClass1<char> sq; //定義一個字元順序隊sq char e; cout << "建立一個空隊sq\n"; cout << "元素a進隊\n"; sq.enQueue1('a'); cout << "元素b進隊\n"; sq.enQueue1('b'); cout << "元素c進隊\n"; sq.enQueue1('c'); cout << "元素d進隊\n"; sq.enQueue1('d'); cout << "元素e進隊\n"; sq.enQueue1('e'); cout << "sq中元素個數:" << GetCount(sq) << endl; cout << "進隊第2個元素x" << endl; enQueuek(sq, 2, 'x'); cout << "隊頭到隊尾元素:"; Display(sq); cout << "出隊第4個元素" << endl; deQueuek(sq, 4, e); cout << "第4個元素為" << e << endl; cout << "隊頭到隊尾元素:"; Display(sq); cout << "銷燬隊sq" << endl; }