hdu 5819 Joint Stacks

题意:模拟两个栈,多了一个合并操作

思路:将合并操作后的数据扔到一个优先队列里,然后用一个指标指向不为空的栈(一开始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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值