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;
}
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);	//结束程序
				
		}
	}

测试结果

在这里插入图片描述

总结

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

猜你喜欢

转载自blog.csdn.net/qq_54388490/article/details/121422310