環形佇列的實現
阿新 • • 發佈:2018-11-27
一、佇列的定義
佇列是一種特殊的線性表,線性表兩端都可以進行插入刪除,而佇列只能在隊頭刪除,隊尾插入。插入元素稱為入隊,刪除元素稱為出隊。
特點:
1、佇列只允許在隊頭插入,隊尾刪除;
2、先入隊的元素在對頭,後入隊的元素在隊尾;
3、佇列遵循“先進先出”的原則。
圖示:
(1)普通佇列
(2)環形佇列
二、儲存結構及實現
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<iostream> #include<iomanip> using namespace std; class CRingQueue{ private: int iLen; int iSize; int iFront; int iRear; int *pArr; public: CRingQueue(int size){//建立佇列 iSize = size; iFront = iRear = iLen = 0; pArr = (int*)malloc(sizeof(int)*iSize); memset(pArr, 0, sizeof(int)*iSize); } ~CRingQueue(){free(pArr); pArr = NULL;}/*刪除佇列*/ //隊頭隊尾操作 void QueueRearInc(){iRear++; iRear = iRear % iSize;} void QueueFrontInc(){iFront++; iFront = iFront % iSize;} bool IsEmpty(){return (iLen == 0);}/*佇列判空*/ bool IsFull(){return (iLen >= iSize);}/*佇列判滿*/ int Size(){return iLen;}/*返回佇列現有長度*/ //往隊尾放入元素 bool EnQueue(int element){ if(IsFull()){ cout << "Error : OverFlow !" << endl; return false; } pArr[iRear] = element; QueueRearInc(); iLen++; return true; } int Front(){ if(IsEmpty()) return 0x80000000; return pArr[iFront]; } int Rear(){ if(IsEmpty()) return 0x7FFFFFFF; return pArr[iRear]; } //刪除佇列第一個元素 bool DeQueue(int& element){ if(IsEmpty()){ cout << "Error : UnderFlow" << endl; return false; } element = pArr[iFront]; QueueFrontInc(); iLen--; return true; } //列印佇列中的全部元素 void Disp(){ cout << "QueueBegin>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl; if(!IsEmpty()) cout << "Head : " << Front() << ", Tail : " << Rear() << endl; int iHead = iFront; for(int i = 0; i < iLen; i++){ cout <<setw(4) << pArr[iHead++%iSize]; } cout << endl << ">>>>>>>>>>>>>>>>>>>>>>>>>>>QueueEnd" << endl << endl; } }; void main() { CRingQueue oRingQueue(20); oRingQueue.Disp(); cout << "20 elements enqueue : " << endl; for(int i = 0; i < 25; i++){ oRingQueue.EnQueue(i+1); } oRingQueue.Disp(); cout << "10 elements dequeue : " << endl; for(int i = 0; i < 10; i++){ int iTmp; oRingQueue.DeQueue(iTmp); } oRingQueue.Disp(); }