实验要求
编写一个程序,以菜单形式实现循环队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(1)初始化空队列
(2)建立循环队列
(3)入队
(4)出队
(5)判断队列是否为空,为空返回1,否则返回0
(6)判断队列是否为满,为满返回1,否则返回0
(7)取队头元素
(8)求队列的元素个数,并返回
(9)遍历输出队列元素
代码内容
#include<iostream>
using namespace std;
#define maxsize 10 //宏定义循环队列最大存储空间
#define OK 1
#define ERROR 0
#define OVERFLOW -1
//dypedef:为一种数据类型定义一个新名字
typedef char QElemType;
typedef int Status;
//队列的顺序存储结构,注意成员的大小写
typedef struct queue{
QElemType *base; //存储空间基地址
int front; //头指针
int rear; //尾指针
}sqqueue;
Status InitQueue(sqqueue &q){
//循环队列初始化
//构造一个空队列q
q.base=new QElemType[maxsize]; //为队列分配一个最大容量为maxsize的数组空间
if(!q.base)
exit(OVERFLOW); //储存分配失败退出
q.front=q.rear=0; //头尾指针置0,队列为空
cout<<"建立成功"<<endl;
return OK;
}
Status full(sqqueue q){
//判断队满
//尾指针+1等于头指针,在循环意义上表示队满
if((q.rear+1)%maxsize==q.front)
return OK;
return ERROR;
}
Status empty(sqqueue q){
//判断队空
if(q.front==q.rear)
return OK;
return ERROR;
}
Status queuelength(sqqueue q){
//队列长度
return (q.rear-q.front+maxsize)%maxsize;
}
Status enqueue(sqqueue &q,QElemType e){
//入队
if(full(q)){
cout<<"队列已满"<<endl;
return ERROR;
}
q.base[q.rear]=e; //新元素插入队尾
q.rear=(q.rear+1)%maxsize; //队尾指针加一
return OK;
}
Status dequeue(sqqueue &q,QElemType &e){
//出队
if(empty(q)){
cout<<"该队列为空"<<endl;
return ERROR;
}
e=q.base[q.front]; //保存队头元素,以备使用
q.front=(q.front+1)%maxsize; //队头指针加一
return OK;
}
char gethead(sqqueue q){
//取队头元素
if(!empty(q))
return q.base[q.front]; //返回队头元素的值,队头指针不变
}
void show(){
cout<<"循环队列系统"<<endl;
cout<<"------------"<<endl;
cout<<"1.初始化队列"<<endl;
cout<<"2.入队"<<endl;
cout<<"3.出队"<<endl;
cout<<"4.判断队空"<<endl;
cout<<"5.判断队满"<<endl;
cout<<"6.取队头元素"<<endl;
cout<<"7.求元素个数"<<endl;
cout<<"8.遍历输出"<<endl;
cout<<"9.退出"<<endl;
}
main(){
sqqueue q;
QElemType e;
show(); //菜单显示
int m,n;
//利用循环进行操作
while(OK){
cin>>n;
switch(n){
case 1:
InitQueue(q);
break;
case 2:
cout<<"持续输入,#退出"<<endl;
//循环进行入队操作
while(OK){
cin>>e;
if(e=='#')
break;
else
enqueue(q,e);
cout<<"请继续输入:";
}
cout<<"入队完毕"<<endl;
break;
case 3:
dequeue(q,e);
cout<<"出队元素为:"<<e<<endl;
cout<<"出队完毕"<<endl;
break;
case 4:
if(empty(q))
cout<<"队列为空"<<endl;
else
cout<<"队列非空"<<endl;
break;
case 5:
if(full(q))
cout<<"队列已满"<<endl;
else
cout<<"队列未满"<<endl;
break;
case 6:
cout<<"头元素为:"<<gethead(q)<<endl;
break;
case 7:
cout<<"队列元素个数为:"<<queuelength(q)<<endl;
break;
case 8:
//使用for循环遍历队列
m=(q.rear-q.front+maxsize)%maxsize;
for(int i=0;i<m;i++)
cout<<q.base[(q.front+i)%maxsize]<<endl;
cout<<"遍历完毕"<<endl;
break;
case 9:
exit(0); //结束程序
}
}
测试结果
总结
主要联系对队列的定义,储存方式,基本操作的使用和理解
对于循环队列还是数形结合更便于理解,仅凭想象而不动手操作想要理解吃透还是比较困难的
终于把这个小练习搞完了…又是头秃的一天