描述
用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针)。实现该队列的入队出队以及判断队列是否为空操作。
输入
多组数据,每组数据有两行。第一行为两个整数n和m,n表示入队序列A的长度(n个数依次连续入队,中间没有出队的情况),m表示出队序列B的元素数量(m个数依次连续出队,中间没有入队的情况)。第二行为序列A(空格分隔的n个整数)。当n和m都等于0时,输入结束。
输出
对应每组数据输出一行。每行包括m+1个整数,前m个数代表出队序列B的各个整数,最后一个整数表示队列是否为空,队列为空输出0,不为空输出1。整数之间用空格分隔。
输入样例 1
5 3 1 3 5 3 6 4 4 -1 2 3 4 0 0
输出样例 1
1 3 5 1 -1 2 3 4 0
#include <iostream>
using namespace std;
#define MAXQSIZE 100
#define OK 1
#define OVERFLOW -2
#define ERROR -1
typedef struct{
int *base;//存储空间的基地址
int front;//头指针
int rear;//尾指针
}SqQueue;
int InitQueue(SqQueue &Q){
Q.base = new int[MAXQSIZE];//为队列分配一个最大容量为MAXSIZE的数组空间
if(!Q.base) exit(OVERFLOW); //存储空间分配失败
Q.front = Q.rear = 0;//头指针和尾指针置为0 队列为空
return OK;
}
int QueueLength(SqQueue Q){
//返回Q的元素个数 即队列长度
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
int EnQueue(SqQueue &Q,int e)//入队
{
if((Q.rear+1)%MAXQSIZE==Q.front)//队满
return ERROR;
Q.base[Q.rear] = e; //新元素插入队尾 队尾指针加一
Q.rear = (Q.rear+1)%MAXQSIZE;
}
int DeQueue(SqQueue &Q,int &e)//删除Q的队头元素 用e返回
{
if(Q.front==Q.rear) return ERROR;//队空
e = Q.base[Q.front];
Q.front =(Q.front+1)%MAXQSIZE;
return OK;
}
int EmptyQueue(SqQueue Q)
{
if(Q.front==Q.rear) return 0;
else return OK;
}
int GetHead(SqQueue Q){
if(Q.front!=Q.rear)//队列非空
return Q.base[Q.front];//返回队头元素的值
}
int main()
{
int n,m;
int q1=0,q2=0;
while(cin>>n>>m&&n!=0&&m!=0)
{
SqQueue Q;
InitQueue(Q);
for(int i =0;i<n;i++){
cin>>q1;
EnQueue(Q,q1);
}
for(int i=0;i<m;i++){
DeQueue(Q,q2);
cout<<q2;
cout<<" ";
}
cout<<EmptyQueue(Q);
cout<<endl;
}
return 0;
}