C++——設計佇列類和迴圈佇列類
阿新 • • 發佈:2018-12-03
設計佇列類和迴圈佇列類
要求:
能夠設計佇列類和迴圈佇列類,實現儲存和取數功能。
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();
}