题意:模拟两个栈,多了一个合并操作
思路:将合并操作后的数据扔到一个优先队列里,然后用一个指标指向不为空的栈(一开始A,B也用了优先队列,可能写搓了,tle了)
#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
struct node
{
int val;
int num;
operator < (const node & p) const{
return val < p.val;
}
};
char cmp[20],index[20];
stack<node> A,B;
priority_queue<node> C;
int main()
{
int n,cas=1;
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n) && n)
{
while(!C.empty()) C.pop();
while(!A.empty()) A.pop();
while(!B.empty()) B.pop();
char p1 = 'C';
printf("Case #%d:\n",cas++);
for(int t =1; t<=n; t++)
{
scanf("%s",cmp);
if(cmp[0] =='p'&& cmp[1] =='u')
{
node xn;
int num;
scanf("%s",index);
scanf("%d",&num);
xn.val = t;xn.num = num;
if(index[0] == 'A')
{
A.push(xn);
}
else
{
B.push(xn);
}
}
else if(cmp[0] =='p'&& cmp[1] =='o')
{
node xn;
scanf("%s",index);
if(p1 == 'C')
{
if(index[0] == 'A')
{
xn = A.top();
A.pop();
}
else
{
xn = B.top();
B.pop();
}
}
else
{
if(index[0] == 'A'){
if(p1=='A'){
if(!A.empty()){
xn = A.top();
A.pop();
}
else{
xn = C.top();
C.pop();
}
}
else{
xn = A.top();
A.pop();
}
}
else{
if(p1 == 'B'){
if(!B.empty()){
xn = B.top();
B.pop();
}
else{
xn = C.top();
C.pop();
}
}
else{
xn = B.top();
B.pop();
}
}
}
printf("%d\n",xn.num);
}
else
{
char a1[10],a2[10];
scanf("%s%s",a1,a2);
if(a1[0]=='A' && a2[0] =='B')
{
p1 = 'A';
}
else if(a1[0] =='B' && a2[0] =='A')
{
p1 = 'B';
}
while(!A.empty())
{
C.push(A.top());
A.pop();
}
while(!B.empty())
{
C.push(B.top());
B.pop();
}
}
}
}
return 0;
}