C++数据结构:循环队列基本运算的实现

实验要求

编写一个程序,以菜单形式实现循环队列的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(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;
}
int 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);	//结束程序
				
		}
		return 0;
	}

测试结果

在这里插入图片描述

总结

主要联系对队列的定义,储存方式,基本操作的使用和理解
对于循环队列还是数形结合更便于理解,仅凭想象而不动手操作想要理解吃透还是比较困难的
终于把这个小练习搞完了…又是头秃的一天

  • 12
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

82年苏打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值