题意:模拟两个栈操作。三种操作,push,pop,merge
merge是合并两个栈。合并操作就是相当于重新将两个栈之前扔进的顺序入栈。
思路:可以合并两个栈的时候可以将他保存到c栈里,原来两个栈清空。然后出栈的时候,如果A,B空了,就去c里pop
#include<bits/stdc++.h>
#define maxn 222222
using namespace std;
struct NODE{
int v,num;
}a[maxn],b[maxn],c[maxn];
int main()
{
int n;
int la,lb,lc;
char s[11];
char s2[11];
char s3[11];
int x;
int kase=0;
while(scanf("%d",&n)&&(n!=0)) {
printf("Case #%d:\n",++kase);
la=0;lb=0;lc=0;
while(n--) {
/* cout << "a=";
for(int i=1;i<=la;i++)
cout << a[i].v << " ";
cout << endl;
cout << "b=";
for(int i=1;i<=lb;i++)
cout << b[i].v << " ";
cout << endl;
cout << "c=";
for(int i=1;i<=lc;i++)
cout << c[i].v << " ";
cout << endl;*/
scanf("%s",s);
if(s[1]=='u') {
scanf("%s%d",s2,&x);
if(s2[0]=='A') {
la++;
a[la].v=x;
a[la].num=n;
}
else {
lb++;
b[lb].v=x;
b[lb].num=n;
}
}
if(s[1]=='o') {
scanf("%s",s2);
if(s2[0]=='A') {
if(la>0) {
printf("%d\n",a[la--].v);
}
else {
printf("%d\n",c[lc--].v);
}
}
if(s2[0]=='B') {
if(lb>0) {
printf("%d\n",b[lb--].v);
}
else {
printf("%d\n",c[lc--].v);
}
}
}
if(s[1]=='e') {
scanf("%s%s",s2,s3);
int tta=1,ttb=1;
while(tta<=la||ttb<=lb) {
if(tta==la+1) {
c[++lc].v=b[ttb++].v;
continue;
}
if(ttb==lb+1) {
c[++lc].v=a[tta++].v;
continue;
}
if(a[tta].num>b[ttb].num) {
c[++lc].v=a[tta++].v;
}
else {
c[++lc].v=b[ttb++].v;
}
}
la=0;
lb=0;
}
}
}
return 0;
}