1. 程式人生 > >C++——設計佇列類和迴圈佇列類

C++——設計佇列類和迴圈佇列類

設計佇列類和迴圈佇列類
要求:
能夠設計佇列類和迴圈佇列類,實現儲存和取數功能。
Append:加入佇列,將一個元素加入到佇列的後面
Get:讀取佇列,從佇列前面讀取並刪除一個元素
IsEmpty:判斷佇列是否為空
IsFull:判斷佇列是否已滿
Traverse:遍歷,從頭至尾訪問佇列的每個單元
Clear:清除,使佇列為空

非迴圈靜態分配空間佇列類基本操作如下:

#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXQSIZE 10 
typedef char QElemType; typedef int Status; class Queue { private: int rear; // 頭指標,若佇列不空,指向佇列頭元素 char front[MAXQSIZE]; // 尾指標,若佇列不空,指向佇列尾元素的下一個位置 public: Queue(); Status IsEmpty(); Status IsFull(); Status Append(QElemType e); Status Get(QElemType &e); Status Traverse
(); Status Clear(); }; Queue::Queue() { cout<<"建構函式使用ing"<<endl; rear=0; } Status Queue::IsEmpty() { if(rear==0) return true; else return false; } Status Queue::IsFull() { if(rear==MAXQSIZE) return true; else return false; } Status Queue::Append(QElemType e) { // 插入元素e為Q的新的隊尾元素
if(IsFull()) // 佇列滿 return ERROR; front[rear++]=e; return OK; } Status Queue::Get(QElemType &e) { // 若佇列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK;否則返回ERROR if(rear==0) // 佇列空 return ERROR; e=front[0]; for(int i=0;i<rear-1;i++) { front[i]=front[i+1]; } rear--; return OK; } Status Queue::Traverse() { if(IsEmpty()) return 0; for(int i=0;i<rear;i++) { cout<<front[i]<<' '; } } Status Queue::Clear() { rear=0; } int main() { Queue Q; char q1[3]={'a','b','c'}; char q2[3]={'d','e','f'}; int i; char e; printf("依次進佇列元素a,b,c\n"); for(i=0;i<3;i++) Q.Append(q1[i]); if(!Q.IsEmpty()) cout<<"此時棧非空\n"; Q.Get(e); cout<<"出隊一個元素:"<<e; cout<<endl<<"依次進佇列元素d,e,f\n"; for(i=0;i<3;i++) Q.Append(q2[i]); cout<<"出隊序列為:"; Q.Traverse(); /* while(!Q.IsEmpty()) { Q.Get(e); cout<<e<<" "; }*/ }

迴圈動態分配儲存空間佇列類操作如下:

#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXQSIZE 10 
typedef char QElemType;
typedef int Status;

class 	Queue {
	private:
		QElemType   *base; 				// 初始化的動態分配儲存空間
		//QElemType   base[MAXQSIZE];   //也可以直接靜態分配儲存空間
		int 		front; 				// 頭指標,若佇列不空,指向佇列頭元素
		int 		rear; 				// 尾指標,若佇列不空,指向佇列尾元素的下一個位置
	public:
		Queue();
		~Queue();
		Status IsEmpty(); 
		Status IsFull(); 
		Status Append(QElemType e);
		Status Get(QElemType &e);
		Status Traverse();
		Status Clear(); 
};

Queue::Queue() {
	// 構造一個空佇列Q
	cout<<"建構函式使用ing"<<endl;
	base=new QElemType[MAXQSIZE];
	if(!base) // 儲存分配失敗
		exit(OVERFLOW);
	front=rear=0;
}

Queue::~Queue()
{
	// 銷燬佇列Q,Q不再存在
	cout<<endl<<"解構函式使用ing"<<endl;
	if(base)
		delete base;  //delete []base
	base=NULL;   
	front=rear=0;
}

Status Queue::IsEmpty()
{
	if(front==rear)
		return true;
	else
		return false;
}


Status Queue::IsFull()
{
	if((rear+1)%MAXQSIZE==front)
		return true;
	else
		return false;
}

Status Queue::Append(QElemType e)
{
	// 插入元素e為Q的新的隊尾元素
	if((rear+1)%MAXQSIZE==front) // 佇列滿
		return ERROR;
	base[rear]=e;
	rear=(rear+1)%MAXQSIZE;
	return OK;
}

Status Queue::Get(QElemType &e)
{
	// 若佇列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK;否則返回ERROR
	if(front==rear) // 佇列空
		return ERROR;
	e=base[front];
	front=(front+1)%MAXQSIZE;
	return OK;
}

Status Queue::Traverse()
{
	for(int i=front;i<rear;i++)
	{
		cout<<base[i]<<' ';
	}
}
Queue::Clear()
{
	rear=front=0;
}
int main()
{
	Queue Q;
	char q1[3]={'a','b','c'};
	char q2[3]={'d','e','f'};
	int i;
	char e;
	printf("依次進佇列元素a,b,c\n");
	for(i=0;i<3;i++)
		Q.Append(q1[i]);
	 
	if(!Q.IsEmpty())
		cout<<"此時棧非空\n"; 
	
	Q.Get(e);
	cout<<"出隊一個元素:"<<e; 
	
	cout<<endl<<"依次進佇列元素d,e,f\n";
	for(i=0;i<3;i++)
		Q.Append(q2[i]);
	
	cout<<"出隊序列為:";
	Q.Traverse();
}