1. 程式人生 > >環形佇列的實現

環形佇列的實現

一、佇列的定義

佇列是一種特殊的線性表,線性表兩端都可以進行插入刪除,而佇列只能在隊頭刪除,隊尾插入。插入元素稱為入隊,刪除元素稱為出隊。

特點:

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();
 
}