2016多校联合训练7&&HDU5818

本文介绍了一个使用优先队列实现的栈操作模拟算法,该算法能够处理push、pop和merge三种基本操作,通过维护三个优先队列来模拟两个栈及它们的合并过程。

【题意】给出两个栈A B(初始时为空),有三种操作:push、pop、merge.其中merge是按照A B中元素进栈的相对顺序来重排的.

【解题方法】模拟水题,优先队列模拟即可。

【AC 代码】

#include <bits/stdc++.h>
using namespace std;
struct node{
    int v,ti;
    bool operator<(const node &rhs) const{
        return ti<rhs.ti;
    }
};
priority_queue<node>que1;
priority_queue<node>que2;
priority_queue<node>que3;

int main()
{
    int n;
    int cas=1;
    while(~scanf("%d",&n)&&n){
        printf("Case #%d:\n",cas++);
        while(!que1.empty()) que1.pop();
        while(!que2.empty()) que2.pop();
        while(!que3.empty()) que3.pop();
        int x,time=0;
        char op1[10],op2[10],op3[10];
        for(int i=1; i<=n; i++){
            scanf("%s",op1);
            if(strcmp(op1,"push")==0){
                scanf("%s%d",op2,&x);
                if(strcmp(op2,"A")==0){
                    que1.push(node{x,time++});
                }
                else{
                    que2.push(node{x,time++});
                }
            }
            else if(strcmp(op1,"pop")==0){
                scanf("%s",op2);
                if(strcmp(op2,"A")==0){
                    if(!que1.empty()){
                        int ans=que1.top().v;
                        que1.pop();
                        printf("%d\n",ans);
                    }
                    else{
                        int ans=que3.top().v;
                        que3.pop();
                        printf("%d\n",ans);
                    }
                }else{
                    if(!que2.empty()){
                        int ans=que2.top().v;
                        que2.pop();
                        printf("%d\n",ans);
                    }else{
                        int ans=que3.top().v;
                        que3.pop();
                        printf("%d\n",ans);
                    }
                }
            }else{
                scanf("%s%s",op2,op3);
                while(!que1.empty()){
                    node tmp=que1.top();
                    que1.pop();
                    que3.push(tmp);
                }
                while(!que2.empty()){
                    node tmp=que2.top();
                    que2.pop();
                    que3.push(tmp);
                }
            }
        }
    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值