如果数组仿真队列进行插入一次删除一次的操作,只要2*n次数组就会被用光,当数组仿真队列的元素出队后,队的首部回空出许多位置,而队尾指针指向队列中最后一个元素位置,空出的位置将无法再被利用,导致队列空间的浪费,并且在新的数据元素入队时,会造成“假溢出”。
解决的方法是将线性数组模拟成环形。可以看出:队满条件是:rear=front。队空条件是rear=front。所以这种方法无法判断究竟是队满还是队空。为了解决这个问题,我们要在入队时少用一个数据元素空间。所以现在队满的条件可用(rear+1)%MaxSize=front来判断。队空条件仍为rear=front。
//循环队列演示程序
#include<iostream>
#define MAXN 5
using namespace std;
int queue[MAXN];
int Front =0; // 头指针
int Rear=0; //尾指针
void addqueue(int value) //输入value值入队列
{
if(Front ==0&&(Rear+1)%MAXN==MAXN)
cout<<"队满"<<endl; //元素从未出队下的队满
else if((Rear+1)%MAXN==Front)
cout <<"队满"<<endl; //已有元素出队情况下的队满
else
{
queue[Rear]=value;
Rear=(Rear+1)%MAXN;
}
}
int delqueue() //输出队列数据
{
int temp;
if(Front == Rear)
cout<<"队列为空"<<endl;
else
{
temp=queue[Front];
queue[Front]=-1; //取出后该位置设置为-1
Front =(Front+1)%MAXN; //指向下一位置
return temp; //输出元素值
}
}
void display() //显示队列里所有的元素值
{
for(int i=0; i<MAXN; ++i)
cout<<queue[i]<<" ";
cout<<endl;
}
void init()
{
for(int i=0; i<MAXN; ++i)
queue[i]=-1;
}
int main()
{
int select,temp;
init();
while(1)
{
cout<<"1.Input a data\n";
cout<<"2.Output a data\n";
cout<<"3.Display the queue\n";
cout<<"Exit\n";
cin>>select;
switch (select)
{
case 1:
cout<<"Please input a value ";
cin>>temp;
addqueue(temp);
break;
case 2:
delqueue();
break;
case 3:
display();
break;
case 4:
return 0;
}
display();
}
return 0;
}