题目描述
根据给定的空间构造顺序循环队列,规定队满处理方法为少用一个元素空间。例如,给定5个元素空间构造循环队列,则只能存放4个元素。试根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出列操作后一次性全部出队的元素值。要求采用顺序队列完成。
输入
输入的第一行为一个自然数n,表示要求构造的顺序循环队列空间数。第二行为操作次k,接下来k行为出队入队操作,每行各代表一次操作。入队用in表示,出队用out表示,如果是入队,则in隔一空格后为一整数,表示入队元素值。
输出
输出完成所有入队出队操作后,一次性出队元素。用一个空格隔开。可以假定队在完成所有操作后不为空。
样例输入 Copy
4
7
in 1
in 2
in 5
in 6
out
out
in 8
样例输出 Copy
5 8
分析:
本题的话是考察循环队列的应用。一开始,我以为队列满了,就覆盖第一个。后来发现不是这样的,他是如果队列满了,在遇到IN 就不要放进去了。
所以本题在PUSH时,要判断队列是否满了。然后本题的数据水了,IN 后面接的都是一位数的数字。
#include"stdio.h"
#include"string.h"
#define MAX_SIZE 10000
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
}SqQueue;
SqQueue Q;
int N;
void PUSH(int digit)
{
if((Q.rear+1)%N!=Q.front)
{Q.data[Q.rear]=digit;
Q.rear++;
}
}
void POP()
{
Q.front++;
}
int main()
{
int k,i,digit;
char a[10],T;
while(~scanf("%d",&N))
{
Q.front=0;
Q.rear=0;
scanf("%d",&k);
scanf("%c",&T);
for(i=1;i<=k;i++)
{
gets(a);
if(a[0]=='i')
{
digit=a[3]-'0';
PUSH(digit);
}
else
{
POP();
}
}
if(Q.front>Q.rear)
{for(i=Q.front;i<N-1;i++)
printf("%d ",Q.data[i]);
for(i=0;i<Q.rear-1;i++)
printf("%d ",Q.data[i]);
printf("%d\n",Q.data[i]);
}
else
{
for(i=Q.front;i<Q.rear-1;i++)
printf("%d ",Q.data[i]);
printf("%d\n",Q.data[i]);
}
}
}