题目大意:有两个栈支持push,pop操作,还可以把两个栈合并,合并时元素push的时刻大的在栈顶。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
using namespace std;
typedef long long ll;
const int maxn=50000+5;
const ll inf=1e9;
const ll mod=1e9+7;
struct node{
int x,id;
};
struct msta{
stack<node> sta;
int next;
}a[maxn];
char s[10];
int siz,cnt,x;
int head1,tail1,head2,tail2;
void mer(int &h1,int &t1,int &h2,int &t2){
if(h1==t1&&h2==t2){
a[t2].next=h1;
h1=h2;
h2=t2=siz;
siz++;
}
else if(h1==t1){
a[h1].next=h2;
t1=t2;
h2=t2=siz;
siz++;
}
else{
a[h2].next=h1;
h1=h2;
h2=t2=siz;
siz++;
}
}
int main()
{
int n;int cas=1;
while(~scanf("%d",&n)){
if(n==0)break;
for(int i=0;i<maxn;i++){
while(a[i].sta.size())a[i].sta.pop();
}
printf("Case #%d:\n",cas++);
siz=2;cnt=1;head1=tail1=0;head2=tail2=1;
for(int i=0;i<n;i++){
scanf("%s",s);//printf("haha1 %s\n",s);
if(s[1]=='u'){
scanf("%s",s);//printf("haha2 %s\n",s);
scanf("%d",&x);
getchar();
if(s[0]=='A'){
a[tail1].sta.push(node{x,cnt});cnt++;
}
else{
a[tail2].sta.push(node{x,cnt});cnt++;
}
}
else if(s[1]=='o'){
scanf("%s",s);
if(s[0]=='A'){ //pop A
while(a[head1].sta.size()==0)head1=a[head1].next;
if(a[tail1].sta.size()==0){
node t2=a[head1].sta.top();
printf("%d\n",t2.x);
a[head1].sta.pop();
}
else{
node t1=a[tail1].sta.top();
node t2=a[head1].sta.top();
if(t1.id>t2.id){
printf("%d\n",t1.x);
a[tail1].sta.pop();
}
else{
printf("%d\n",t2.x);
a[head1].sta.pop();
}
}
}
else{ // pop B
while(a[head2].sta.size()==0)head2=a[head2].next;
if(a[tail2].sta.size()==0){
node t2=a[head2].sta.top();
printf("%d\n",t2.x);
a[head2].sta.pop();
}
else{
node t1=a[tail2].sta.top();
node t2=a[head2].sta.top();
if(t1.id>t2.id){
printf("%d\n",t1.x);
a[tail2].sta.pop();
}
else{
printf("%d\n",t2.x);
a[head2].sta.pop();
}
}
}
}
else {
scanf("%s",s);
scanf("%s",s);
if(s[0]=='A'){ //B A
mer(head2,tail2,head1,tail1);
}
else{
mer(head1,tail1,head2,tail2);
}
}
}
}
return 0;
}
看了题解,加栈C进行优化,我还是太弱辣,比赛时只想到链表 aaaaaaa~
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
using namespace std;
struct node{
int x,id;
};
stack<node> a[4];
char s[10];
int belong;
inline void sol(int x,int y ){
while(!a[x].empty()){a[y].push(a[x].top());a[x].pop();}
}
inline int pop1(int x){
int t=a[x].top().x;
a[x].pop();
return t;
}
inline int pop2(int x){
int t;
if(!a[x].empty()&&!a[2].empty()){
node t1=a[x].top();
node t2=a[2].top();
if(t1.id>t2.id){t=t1.x;a[x].pop();}
else {t=t2.x;a[2].pop();}
return t;
}
if(!a[x].empty()){t=a[x].top().x;a[x].pop();}
else t=a[2].top().x,a[2].pop();
return t;
}
int main()
{
int n;int cas=1;
while(~scanf("%d",&n)){
if(n==0)break;
for(int i=0;i<4;i++){
while(!a[i].empty())a[i].pop();
}
belong=-1;int cnt=1,x;
printf("Case #%d:\n",cas++);
for(int i=0;i<n;i++){
scanf("%s",s);//printf("haha1 %s\n",s);
if(s[1]=='u'){
scanf("%s",s);//printf("haha2 %s\n",s);
scanf("%d",&x);
getchar();
if(s[0]=='A'){
a[0].push(node{x,cnt});cnt++;
}
else{
a[1].push(node{x,cnt});cnt++;
}
}
else if(s[1]=='o'){
scanf("%s",s);
if(s[0]=='A'){ //pop A
if(belong==0)printf("%d\n",pop2(0));
else printf("%d\n",pop1(0));
}
else{ // pop B
if(belong==1)printf("%d\n",pop2(1));
else printf("%d\n",pop1(1));
}
}
else {
scanf("%s",s);
scanf("%s",s);
//while(!a[3].empty())a[3].pop();
if(s[0]=='A')belong=1;
else belong=0;
while(!a[0].empty()&&!a[1].empty()){
node t1=a[0].top();
node t2=a[1].top();
if(t1.id>t2.id)a[3].push(t1),a[0].pop();
else a[3].push(t2),a[1].pop();
}
if(!a[0].empty())sol(0,3);
else if(!a[1].empty())sol(1,3);
while(!a[3].empty())a[2].push(a[3].top()),a[3].pop();
}
}
}
return 0;
}