7-14 特殊队列 (30 分)
普通的队列仅有 EnQueue 和 DeQueue 两种操作,分别表示在队尾增加元素和取出队首元素。现在给队列增加一种新的操作 DeleteMid,表示删除队列的中间元素。对于有 N 个元素的队列,若 N 为偶数,中间元素定义为从队首到队尾的第 N/2 个元素;若 N 为奇数,中间元素定义为第 (N+1)/2 个元素。现给出队列的一系列操作,输出相应结果。
输入格式:
第一行输入一个不超过 106 的正整数 M 和 N,分别表示指令条数和队列容量。
之后 M 行,每行给出一条指令,为下列3种指令之一:
EnQueue elem
DeQueue
DeleteMid
输出格式:
对于每个 EnQueue 指令,若未超出队列容量,不输出任何信息,否则在一行中输出Full Queue
。
对于每个 DeQueue 和 DeleteMid 指令,若队列不为空,则取出相应元素并输出;否则只在一行中输出Empty Queue
。
最后在一行中按从队首到队尾的顺序依次输出队列中的元素,以空格分隔。行尾不得有多余空格。
输入样例:
10 4
DeQueue
EnQueue 2
EnQueue 3
EnQueue 4
EnQueue 5
DeleteMid
DeleteMid
EnQueue 7
EnQueue 8
EnQueue 9
输出样例:
Empty Queue
3
4
Full Queue
2 5 7 8
作者: 孔德桢
单位: 浙江大学城市学院
时间限制: 1000 ms
内存限制: 64 MB
#include <bits/stdc++.h>
using namespace std;
deque<int> first,second;
void func() {
int a=first.size(),b=second.size();
if(a==0 && b==0)
return;
if(b-a>2) {
first.push_back(second.front());
second.pop_front();
} else if(b<=a) {
second.push_front(first.back());
first.pop_back();
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
// freopen("out.txt","w",stdout);
int m,n;
cin>>m>>n;
string str;
int s;
while(m--) {
cin>>str;
func();
if(str=="EnQueue") {
cin>>s;
if(first.size()+second.size()>=n) {
cout<<"Full Queue"<<endl;
continue;
}
second.push_back(s);
} else if(str=="DeQueue") {
if(!first.empty()) {
cout<<first.front()<<endl;
first.pop_front();
} else if(!second.empty()) {
cout<<second.front()<<endl;
second.pop_front();
} else
cout<<"Empty Queue"<<endl;
} else {
if(!second.empty()) {
cout<<second.front()<<endl;
second.pop_front();
} else
cout<<"Empty Queue"<<endl;
}
}
int flag=0;
while(!first.empty()) {
if(flag) cout<<' ';
cout<<first.front();
first.pop_front();
flag=1;
}
while(!second.empty()) {
if(flag) cout<<' ';
cout<<second.front();
second.pop_front();
flag=1;
}
return 0;
}