题目描述
根据给定的空间构造顺序循环队列,规定队满处理方法为少用一个元素空间。例如,给定5个元素空间构造循环队列,则只能存放4个元素。试根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出列操作后一次性全部出队的元素值。要求采用顺序队列完成,少用一个存储空间的方法区分队列的空和满。
输入
输入的第一行为一个自然数n,表示要求构造的顺序循环队列空间数。 第二行为操作次k,接下来k行为出队入队操作,每行各代表一次操作。入队用in表示,出队用out表示,如果是入队,则in隔一空格后为一整数,表示入队元素值。
输出
输出完成所有入队出队操作后,一次性出队元素。用一个空格隔开。可以假定队在完成所有操作后不为空。
样例输入
4
7
in 1
in 2
in 5
in 6
out
out
in 8
样例输出
5 8
参考程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 50
int Maxsize;
typedef int Elemtype;
typedef struct sqQueue
{
/* 队的建立 */
Elemtype data[MaxSize];
int front, rear;
}SqQueue;
void InitQueue(SqQueue *&q)
{
/* 初始化队列 */
q = (SqQueue *) malloc (sizeof(SqQueue));
q->front = q->rear = 0;
}
void EnQueue(SqQueue *&q, Elemtype e)
{
if((q->rear + 1) % Maxsize == q->front)
return ;
/* 入队操作 */
q->rear = (q->rear + 1) % Maxsize;
q->data[q->rear] = e;
return ;
}
void DeQueue(SqQueue *&q, Elemtype &e)
{
/* 出队操作 */
if( q->front == q->rear )
return ;
q->front = (q->front + 1) % Maxsize;
e = q->data[q->front];
return ;
}
void print(SqQueue *q)
{
while(q->front != q->rear)
{
q->front=(q->front+1)%Maxsize;
printf("%d ",q->data[q->front]);
}
}
int main()
{
SqQueue *q;
InitQueue(q);
Elemtype e;
int k;
char c[10];
scanf("%d\n%d", &Maxsize, &k);
while( k != 0)
{
scanf("%s", c);
if(strcmp("in",c)==0)
{
scanf("%d",&e);
EnQueue(q, e);
}
else
DeQueue(q, e);
k--;
}
print(q);
// while(q->front != q->rear)
// {
// DeQueue(q, e);
// printf("%d ", e);
// }
return 0;
}
注意
该程序仅供学习参考!