循环队列
时间限制:1秒 内存限制:256M
【问题描述】
用数组模拟队列操作,可以类比成:队首指针front始终在一条直线追赶队尾指针rear,当front与rear相遇时(front==rear),队列为空,称这样的队列为线性队列。在这个过程中,front走过的地方,再也不会走到,造成极大的空间浪费。
如果把模拟队列的数组看成一个首尾相接的圆环,此时的队列操作,就是front在一个圆环上追赶rear,称这样的队列为循环队列。显然front走过的地方,可以多次重复走到。
由于front和rear在圆环上追赶,当front与rear相遇(front==rear)时,队列是空还是满呢?不好判断,因为有可能rear比front多跑一圈。所以,我们在定义循环队列时,需要特别注意数组的大小,一般的要先分析队列中可能的最多元素个数,数组的大小应比最多元素个数大,这时候才能用front==rear判断队列为空。
现在的问题是:我们给出一个循环队列的空间限制n,然后给出m个进队和出队的操作,请你输出最后的队列中的元素(按元素依次出队的顺序)。要特别说明的是,根据数组队列的操作规则,rear始终是指向队尾元素的后面的位置,所以给出循环队列空间为n,则实际只能使用n-1个空间。另外,由于空间的限制,当rear与front相遇后(溢出),应丢弃队首元素,为rear腾空间!
【输入格式】
第一行一个自然数n,表示要求构造的顺序循环队列空间数。第二行为操作次数k,接下来k行为出队入队操作,每行各代表一次操作。入队用in x表示,表示把整数x入队,出队用out表示(如果队列为空,则忽略次操作)。
【输出格式】
输出完成所有入队出队操作后,如果队列为空则输出-1,否则一次性出队元素,元素间用一个空格隔开。
【输入输出样例】
Input
4
7
in 1
in 2
in 5
in 6
out
out
in 8
Output
6 8
【数据限制】
对于 \(100\%\) 的数据有:\(1<=n,k<=100000\),\(x\) 为 int 范围内的整数。
【来源】
Mr.he