顺序循环队列,规定队满处理方法为少用一个元素空间。例如,给定5个元素空间构造循环队列,则只能存放4个元素。根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出队操作后一次性全部出队的元素值。
输入:输入的第一行为一个自然数n,表示要构造的顺序循环队列空间数。
第二行为操作次数k,接下来k行为出队入队操作,每行代表一次操作。入队用in表示,出队用out表示
输出:输出完成所有入队出队操作后,一次性出队元素。用一个空格隔开。
输入输出样例:1组
#1
样例输入:
4
7
in 1
in 2
in 5
in 6
out
out
in 8
样例输出:
5 8
//注意
//1:该程序每次运行的时间必须小于10秒,否则会超时,程序超时将不会测试剩余的测试集
//2:该程序每次运行使用的内存不能超过1M,否则会返回错误
//3:该程序每次运行输出的结果最多显示1000个字符(多余的不显示),每行末尾的所有空格用□表示
#include<iostream>
#include<stdlib.h>
using namespace std;
int n;
typedef struct
{
int *data;
int front,rear;
}CSeQueue;
CSeQueue *Init_SeQueue();
void In_SeQueue(CSeQueue *q);
void Out_SeQueue(CSeQueue *q);
int main()
{
int m;
//cout<<"输入队列空间大小n";
cin>>n;
//cout<<"输入操作次数m";
cin>>m;
string str;
CSeQueue *q;
q=Init_SeQueue();
for(int i=0;i<m;i++)
{
//cout<<"输入操作";
cin>>str;
if(str=="in")
In_SeQueue(q);
if(str=="out")
q->front=(q->front+1)%n;
}
while((q->front+1)%n!=q->rear)//输出队列剩余元素(不包含最后一个)
{
Out_SeQueue(q);
}
Out_SeQueue(q);//q->front+1)%n==q->rear时,输出最后一个元素
return 0;
}
CSeQueue *Init_SeQueue()
{
CSeQueue *q;
q=new CSeQueue;
q->data=(int *)malloc(n*sizeof(int));//开一个大小为n的队列
q->front=q->rear=0;
return q;
}
void In_SeQueue(CSeQueue *q)
{
int x;
//cout<<"输入队列元素值x";
cin>>x;
if((q->rear+1)%n==q->front)//牺牲一个空间判队满,即只能装(n-1)个元素
return;
else
{
q->rear=(q->rear+1)%n;//入队
q->data[q->rear]=x;
}
}
void Out_SeQueue(CSeQueue *q)
{
q->front=(q->front+1)%n;//出队
cout<<q->data[q->front]<<" ";
}