循环队列的基本操作

由于Q.real=Q.front无法判别队列是“空”还是“满”,此处条件设置为:少用一个元素空间,约定以“队头指针在队尾指针的下一位置上”作为队列呈'“满”状态的标志

#include<iostream>
using namespace std;

//-----------------循环队列——队列的顺序存储结构-----------------
#define ok 1
#define error 0
#define COUNT 5
#define MAXQSIZE 6//最大队列长度
typedef int QElemType;
typedef  int Status;
typedef struct
{
	QElemType *base;//初始化的动态分配存储空间
	int front;//对头指针
	int rear;//队尾指针
}SqQueue;

//----------------基本操作的函数原型说明-------------------
class QueueOperation{
public:
	Status InitQueue(SqQueue &Q);//构造一个空队列Q
	Status DestroyQueue(SqQueue &Q);//销毁队列Q,Q不在
	Status ClearQueue(SqQueue &Q);//将Q清为空队列
	Status QueueEmpty(SqQueue Q);//若队列Q为空队列,则返回true,否则返回false
	int QueueLength(SqQueue Q);//返回Q的元素个数,即为队列的长度
	Status GetHead(SqQueue Q,QElemType &e);//用e返回Q的队头元素
	Status EnQueue(SqQueue &Q,QElemType e);//插入元素e为Q的新队尾元素
	Status DeQueue(SqQueue &Q,QElemType &e);//删除Q的对头元素,用e返回其值
	Status QueueTraverse(SqQueue Q,Status (*visit)(QElemType));//用visit()遍历队列Q
};//QueueOperation

Status QueueOperation::InitQueue(SqQueue &Q)
{
	Q.base=new QElemType[MAXQSIZE];
	if(!Q.base)
	{
		cout<<"存储失败"<<endl;
		exit(-1);
	}//if
	Q.front=0;
	Q.rear=0;
	return ok;
}//InitQueue

Status QueueOperation::DestroyQueue(SqQueue &Q)
{
	delete Q.base;
	Q.base=NULL;
	return ok;
}//DestroyQueue

Status QueueOperation::ClearQueue(SqQueue &Q)
{
	Q.front=0;
	Q.rear=0;
	return ok;
}//ClearQueue

Status QueueOperation::QueueEmpty(SqQueue Q)
{
	if(Q.rear==Q.front)
		return true;
	else
		return error;		
}//QueueEmpty

int QueueOperation::QueueLength(SqQueue Q)
{
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}//QueueLength

Status QueueOperation::GetHead(SqQueue Q,QElemType &e)
{
	e=Q.base[Q.front];
	return ok;
}//GetHead

Status QueueOperation::EnQueue(SqQueue &Q,QElemType e)
{
	if((Q.rear+1)%MAXQSIZE==Q.front)//队满
	{
		cout<<"队列Q已满,不能继续添加"<<endl;
		return error;
	}//if
	Q.base[Q.rear]=e;//队尾添加元素
	Q.rear=(Q.rear+1)%MAXQSIZE;
	return ok;
}//EnQueue

Status QueueOperation::DeQueue(SqQueue &Q,QElemType &e)
{
	if(Q.rear==Q.front)
	{
		cout<<"队列Q为空"<<endl;
		return error;
	}//if
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return ok;
}//DeQueue

Status visit(QElemType e)
{
	cout<<e<<endl;
	return ok;
}//visit

Status QueueOperation::QueueTraverse(SqQueue Q,Status (*visit)(QElemType))
{
	while(Q.front!=Q.rear)
	{
		visit(Q.base[Q.front]);
		Q.front=(Q.front+1)%MAXQSIZE;
	}//while
	return ok;
}//QueueTraverse

void main()
{
	QueueOperation QOP;
	SqQueue Q;
	QElemType e;
	QOP.InitQueue(Q);
	Status (*vis)(QElemType);
	vis=visit;
	for(int i=1;i<=COUNT;i++)
	{
		QOP.EnQueue(Q,i);
	}//for
	cout<<"输出队列Q中的元素:"<<endl;
	QOP.QueueTraverse(Q,vis);
	cout<<"队列Q的长度Length= ";cout<<QOP.QueueLength(Q)<<endl;
	cout<<"队列Q的队头元素:";
	QOP.GetHead(Q,e);cout<<e<<endl;
	cout<<"删除队列Q的对头元素,Q中剩余元素:"<<endl;
	QOP.DeQueue(Q,e);
	QOP.QueueTraverse(Q,vis);
	cout<<"添加一个新的元素,队列Q中元素:"<<endl;
	QOP.EnQueue(Q,6);
	QOP.QueueTraverse(Q,vis);
	cout<<"继续向队列Q中添加元素:"<<endl;
	QOP.EnQueue(Q,7);
	cout<<"销毁队列Q:成功/失败(1/0):"<<QOP.DestroyQueue(Q)<<endl;
}//main


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值