数据结构实验四

发布于 2024-10-13  388 次阅读


4-1

#include <iostream>
#include <cstdlib>
using namespace std;
#define MAXQSIZE 10	//最大队列长度,实际使用MAXQSIZE-1
typedef int ElemType;

//循环队列(☆☆☆☆少用一个存储单元☆☆☆☆☆)
typedef struct
{
	//======补充代码======
	ElemType *base;
	int front;
	int rear;
}SqQueue;

//函数声明
void PrintQueue(SqQueue &Q);
int InitQueue(SqQueue &Q);
int QueueEmpty(SqQueue &Q);
int QueueLength(SqQueue &Q);
int GetHead(SqQueue &Q,ElemType &e);
int EnQueue(SqQueue &Q,ElemType e);
int DeQueue(SqQueue &Q,ElemType &e);
void Circle(SqQueue &Q);
void Reverse(SqQueue &Q);

//输出队列中元素值,从头到尾
void PrintQueue(SqQueue &Q)
{
	int p=Q.front;
	//判断队列是否为空
	if(!QueueEmpty(Q))
	{
		while(p!=Q.rear)
		{
			cout<<Q.base[p]<<endl;
			p = (p+1)%MAXQSIZE;
		}
	}
}

//构造一个空队列Q,分配空间并做初始化,成功返回1,否则返回0
int InitQueue(SqQueue &Q)
{
	//======补充代码======
	Q.base = (ElemType*)malloc(MAXQSIZE * sizeof(ElemType));
	if(!Q.base) return 0;
	Q.front = Q.rear = 0;
	return 1;
}

//队列判空,若队列Q为空队列,则返回1,否则返回0
int QueueEmpty(SqQueue &Q)
{
	//======补充代码======
	return Q.front == Q.rear;
}

//求队列的长度
int QueueLength(SqQueue &Q)
{
	//======补充代码======
	return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

//求队头元素值,若队列不为空,则用e返回Q的队头元素,并返回1;否则返回0
int GetHead(SqQueue &Q,ElemType &e)
{
	//======补充代码======
	if (QueueEmpty(Q)) {
		return 0;
	}
	e = Q.base[Q.front];
	return 1;
}

//插入元素e作为Q的新的队尾元素,队满则返回0,否则返回1
int EnQueue(SqQueue &Q,ElemType e)
{
	//======补充代码======
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXQSIZE;
	return 1;
}

//若队列不空,则删除Q的队头元素,用e返回其值,并返回1,否则返回0
int DeQueue(SqQueue &Q,ElemType &e)
{
	//======补充代码======	
	if (QueueEmpty(Q)) {
		return 0;
	}
	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXQSIZE;
	return e;
}

//若队列不空,将队头元素塞到队尾
void Circle(SqQueue &Q)
{
	//======补充代码======	
	if (QueueEmpty(Q)) {
		return;
	}
	int e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXQSIZE; 
	EnQueue(Q, e);
	
}

//若队列不空,队列逆序
void Reverse(SqQueue &Q)
{
	//======补充代码======		
	if (QueueEmpty(Q)) {
		return;
	}
	int p = Q.front, q = Q.rear;
	while((p + 1) % MAXQSIZE != q && p != q) {
		int iq = (q - 1) < 0 ? MAXQSIZE - 1 : q - 1;
		int x = Q.base[p];
		Q.base[p] = Q.base[iq];
		Q.base[iq] = x;
		p = (p + 1) % MAXQSIZE;
		q = (q - 1 + MAXQSIZE) % MAXQSIZE; 
	}
	PrintQueue(Q);
}
/*
输入输出约定 ,多行输入:
0   //输出全部元素
1 x //进队操作,第2个数代表添加的元素值,队列满则输出-1
2   //出队操作,输出出队的元素,如果队空没有元素输出-1
3   //取队头元素,输出队头元素,如果队空没有元素输出-1
4   //求长度,输出队列长度
5   //判断是否为空,空输出1,非空输出0
6   //队头塞到队尾
7   //逆序
-1  //程序结束
*/
//主函数
int main( )
{
	SqQueue Q;
	int select;
	ElemType e;
	//初始化队列,如果无法分配程序退出
	if ((InitQueue(Q))==0)
		return 0;
	
	//处理输入输出
	while(cin>>select)
	{
		//程序结束
		if(select==-1)
			return 0;
		//输出元素
		else if(select==0)
			PrintQueue(Q);
		//进队
		else if(select==1)
		{
			//--------补充代码--Start------
			cin >> e;
			if ((Q.rear + 1) % MAXQSIZE == Q.front) {
			return 0;
			}
			EnQueue(Q, e);
			//--------补充代码--End-------
		}
		//出队
		else if(select==2)
		{
			//--------补充代码--Start------
			if (QueueEmpty(Q)) {
				return -1;
			}
			e = DeQueue(Q, e);
			cout << e << "\n";
			//--------补充代码--End-------
		}
		//求队头
		else if(select==3)
		{			
			if(GetHead(Q,e)==0)	
				cout<<"-1"<<endl;
			else	
				cout<<e<<endl;
		}
		//求队列长度
		else if(select==4)
			cout<<QueueLength(Q)<<endl;
		//判断队空
		else if(select==5)
			cout<<QueueEmpty(Q)<<endl;
		//队头塞到队尾
		else if(select==6)					
			Circle(Q);		
		//翻转
		else if(select==7)				
			Reverse(Q);		
	}
	return 0;
}