版权声明:转载请注明出处 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;
}