循环队列的顺序表示和实现

版权声明:转载请注明出处 https://blog.csdn.net/doubleguy/article/details/84023509

这里要注意的就是假溢出的现象,为了解决这个问题,我们决定用循环队列实现队列的顺序表示形式。

我用了一段小程序将这些功能都覆盖进去了,可以参考一下。

代码如下:

#include<bits/stdc++.h>
typedef int Status;
const int maxn = 1111;
using namespace std;
typedef struct{
	int *base;
	int front;
	int rear;
}SqQueue;

Status InitQueue(SqQueue &q){
	q.base = new int[maxn];
	if(!q.base)
		exit(-2);
	q.front = q.rear = 0;
	return 1;
}

int QueueLength(SqQueue q){
	return (q.rear-q.front+maxn)%maxn;//这里q.rear-q.front可能为负数,所以+maxn来确保q.rear-q.front+maxn是大于0的,再求膜 
}

Status EnQueue(SqQueue &q,int e){
	if((q.rear+1)%maxn == q.front)
		return 0;
	q.base[q.rear] = e;
	q.rear = (q.rear+1)%maxn;//这里是q.rear+1不会出现负数,所以先变正数再求膜了 
	return 1;
}

Status DeQueue(SqQueue &q,int &e){
	if(q.front == q.rear)
		return 0;
	e = q.base[q.front];
	q.front = (q.front+1)%maxn;
	return 1;
}

int GetHead(SqQueue q){
	if(q.front != q.rear)
		return q.base[q.front];
}

void PrintQueue(SqQueue q){
	while(q.rear != q.front){
		cout<<q.base[q.front]<<" ";
		q.front = (q.front+1)%maxn; 
	} 
	cout<<endl;
}

int main(){
	int status;
	int e;
	int n;
	SqQueue q;
	status = InitQueue(q);
	if(status)
		cout<<"初始化成功!"<<endl;
	else
		cout<<"初始化失败!地址不足,无法为其分配地址!"<<endl;
	e = QueueLength(q);
	cout<<"当前循环队列的长度为:"<<e<<endl;
	cout<<"请输入你要入队元素的个数:";
	cin>>n;
	for(int i=0;i<n;i++){
		cout<<"请输入你要入队的元素:";
		cin>>e;
		status = EnQueue(q,e);
		if(status){
			cout<<"入队成功!当前队中元素为:";
			PrintQueue(q);
			cout<<"当前队列长度为:"<<QueueLength(q)<<endl;
		}
		else
			cout<<"入队失败,空间不足!"<<endl; 
	}
	cout<<"当前队头元素为:"<<GetHead(q)<<endl;
	cout<<"请输入你想出队的元素个数:";
	cin>>n;
	if(n>QueueLength(q))
		cout<<"你输入的数超出队列的长度!"<<endl;
	else{
		for(int i=0;i<n;i++){
			status = DeQueue(q,e);
			if(status){
				cout<<"出队成功,出队元素为:"<<e<<endl;
				cout<<"当前队中元素为:";
				PrintQueue(q);
				cout<<"当前队列长度为:"<<QueueLength(q)<<endl;
			}
			else
				cout<<"出队失败,当前队列已为空队列!"<<endl;
		} 
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/doubleguy/article/details/84023509