版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
247附加判定标志的循环队列的基本操作
描述
假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag== 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
输入
多组数据,每组数据有两行。第一行为一个整数n,n表示入队序列A的长度(n个数依次连续入队,中间没有出队的情况),第二行为序列A(空格分隔的n个整数)。当n=0时,输入结束。
输出
对应每组数据输出一行。依次输出队列中所有的整数,每两个整数之间用空格分隔。
输入样例 1
4
1 2 3 4
5
1 2 4 5 3
0
输出样例 1
1 2 3 4
1 2 4 5 3
#include<iostream>
using namespace std;
#define MAX 100
#define OK 0
#define OVERFLOW -1
#define ERROR -2
typedef struct
{
int *base;
int front;
int rear;
int tag;
}SqQueue;
int InitQueue(SqQueue &Q)
{
Q.base=new int[MAX];
if(!Q.base) return OVERFLOW;
Q.front=Q.rear=Q.tag=0;
return OK;
}
int EnQueue(SqQueue& Q,int e)
{
if(Q.tag==1&&Q.front==Q.rear)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAX;
if(Q.tag==0)
Q.tag=1;
return OK;
}
int DeQueue(SqQueue &Q)
{
if(Q.tag==0&&Q.front==Q.rear)
return ERROR;
int e=Q.base[Q.front];
Q.front=(Q.front+1)%MAX;
if(Q.tag==1)
Q.tag=0;
return e;
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
SqQueue Q;
InitQueue(Q);
for(int i=0;i<n;i++)
{
int x;cin>>x;
EnQueue(Q,x);
}
for(int j=0;j<n-1;j++)
cout<<DeQueue(Q)<<" ";
cout<<DeQueue(Q)<<endl;
}
return 0;
}