佇列(C++模板實現)
阿新 • • 發佈:2019-02-09
一,佇列的基本概念
佇列特性:先進先出(FIFO)——先進佇列的元素先出佇列。來源於我們生活中的佇列(先排隊的先辦完事)。
佇列有下面幾個操作:
- InitQueue() ——初始化佇列
- EnQueue() ——進佇列
- DeQueue() ——出佇列
- IsQueueEmpty()——判斷佇列是否為空
- IsQueueFull() ——判斷佇列是否已滿
佇列可以由陣列和連結串列兩種形式實現佇列操作(c語言),下面僅以陣列為例:
二,佇列的陣列實現
(1)Queue.h中的程式碼如下:
<pre name="code" class="html">#include "stdafx.h" #include "iostream" using namespace std; template<class DataType> class Queue { public: Queue(int size) { maxSize=size; front=0; rear=0; count=0; elements=NULL; elements = new DataType[size];//分配記憶體 if (elements == NULL) { exit(1); }else { for (int i = 0; i < size; i++) { elements[i]=0; } } } ~Queue() { //delete[] elements; destroyQueue(); } //佇列中的資料個數 int getNum() { return count; } //入隊 int insertData(DataType nData); //出隊 DataType outData(); //佇列空與否 bool IsEmpty(); //摧毀佇列 bool destroyQueue(); private: int maxSize; int count;//統計元素個數 int front;//隊首 int rear;//隊尾 DataType *elements; }; template <class DataType> int Queue<DataType>::insertData(DataType nData) { if (count >= maxSize) { cerr<<"分配的已使用完!請勿再新增資料"<<endl; exit(1); } else { elements[rear]=nData; rear++; count++; return 1; } return 0; } template<class DataType> DataType Queue<DataType>::outData() { if (count == 0) { cerr<<"資料已經刪除完!請勿再刪除資料"<<endl; exit(1); } else { DataType temp=NULL; temp=elements[front]; front++; count--; return temp; } } template<class DataType> bool Queue<DataType>::IsEmpty() { if (count == 0) { return true; }else { return false; } } template <class DataType> bool Queue<DataType>::destroyQueue() { if (elements == NULL) { return false; }else { delete[] elements; elements=NULL; return true; } }
(2)主測試程式碼如下:
<pre name="code" class="html">// ConsoleAppQueue.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include "Queue.h" #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { Queue<char> S(10); char src='A'; for (int i = 0;i < 10; i++) { S.insertData(src++); } cout<<"當前佇列元素個數為:"<<S.getNum()<<endl; cout<<"---------------------佇列初始化已經完成-------------------"<<endl; cout<<"---------------------輸出佇列元素-------------------"<<endl; for (int i = 0;i < 10; i++) { cout<<S.outData()<<" "; } cout<<endl; if (S.IsEmpty()) { cout<<"佇列已經空"<<endl; } else { cout<<"當前佇列元素個數為:"<<S.getNum()<<endl; } system("pause"); return 0; }
(3)測試結果:
三,佇列的連結串列實現
(1)Queue.h的程式碼如下:
#include "stdafx.h" #include "iostream" using namespace std; template<class DataType> class Queue; template <class DataType> class LinkNode { public: LinkNode() { nData=0; next=NULL; } LinkNode(DataType newData) { nData=newData; next=NULL; } ~LinkNode() { } private: friend class Queue<DataType>; DataType nData; LinkNode<DataType> *next; }; template<class DataType> class Queue { public: Queue(int size) { front=new LinkNode<DataType>; rear=new LinkNode<DataType>; count=0; maxSize=size; } ~Queue() { destroyQueue(); } //獲取佇列中的元素個數 int getNum() { return count; } //入隊 int insertNode(DataType nData); //出隊 bool delNode(); //佇列空與否 bool IsEmpty(); //摧毀佇列 void destroyQueue(); private: LinkNode<DataType> *front; LinkNode<DataType> *rear; int count; int maxSize; }; template<class DataType> bool Queue<DataType>::IsEmpty() { if (count == 0) { return true; } else { return false; } } template<class DataType> int Queue<DataType>::insertNode(DataType nData) { LinkNode<DataType> *newNode= new LinkNode<DataType>(nData); if (newNode == NULL) { exit(1); } if (rear == NULL && front == NULL) { rear=newNode; front=newNode; count++; return 1; }else { LinkNode<DataType> *p=front; int step=1; while (step < count) { p=p->next; step++; } p->next=newNode; rear=newNode; count++; return 1; } return 0; } //出隊 template<class DataType> bool Queue<DataType>::delNode() { if (getNum() == 0) { exit(1); }else {// if (front !=NULL) { cout<<"出隊元素為:"<<front->nData<<" "; LinkNode<DataType> *p=front; front=p->next; delete p; count--; return true; }else { cerr<<"錯誤!元素已經全部出隊"<<endl; return false; } } } template<class DataType> void Queue<DataType>::destroyQueue() { int len=getNum(); for (int i=0;i<len; i++) { if (getNum() == 0) { cout<<"佇列已經空,請勿再操作"<<endl; break; } delNode(); } }
(2)主測試程式碼:
// ConsoleAppQueueList.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include "Queue.h"
#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int nLen=10;
Queue<char> S(nLen);
char str='A';
for (int i = 0;i < nLen;i++ )
{
S.insertNode(str++);
}
cout<<"當前佇列中的元素個數為:"<<S.getNum()<<endl;
cout<<"--------------------佇列初始化已經完成--------------------"<<endl;
for (int i=0;i<nLen; i++)
{
cout<<"第"<<i+1<<"次出隊!"<<" ";
if (S.getNum() == 0)
{
cout<<"佇列已經空,請勿再操作"<<endl;
break;
}
S.delNode();
cout<<" ";
cout<<"當前佇列中的元素個數為:"<<S.getNum()<<endl;
}
system("pause");
return 0;
}
(3)測試結果:
參考資源:
【1】《演算法導論》
【2】http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html
【3】http://blog.chinaunix.net/uid-26548237-id-3473528.html