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();
}
posted @ 2018-11-18 16:58  聚落  阅读(1597)  评论(0编辑  收藏  举报