GOJ 1443 堆箱子咯 (判断出栈顺序是否合理)

堆箱子咯

Time Limit: 2000/1000ms (Java/Others)
Problem Description:
双十一大家都在买买买,可忙坏了快递小哥了。zl和皮卡鸡在大伙在剁手的时候,偷偷去快递公司那当兼职赚钱了。zl将箱子一个个叠起来,皮卡鸡将那堆箱子搬到别的地方去,但由于箱子太重,他每次只能拿最上面的一个。zl一边叠箱子,皮卡鸡就一边把目前最上面的箱子搬走,但由于动作快慢不一,有时候zl叠了几个箱子皮卡鸡才搬走一个,有时候皮卡鸡搬走几个箱子,zl才叠上去一个……那么问题来了,根据zl叠箱子的顺序,皮卡鸡搬箱子的顺序可不可能实现?(每个箱子都以一个字符编号,每个字符各不相同)
Input:
输入包含多组数据。
每组数据第一行输入一个整数n(3 < n < 100),表示箱子的个数,第二行输入一串字符s,表示zl叠箱子的顺序,第三行输入一串字符c,表示皮卡鸡搬箱子的顺序
Output:
如果可以实现,输出“yes”,否则输出“no”,每个输出占一行,不包括双引号。
Sample Input:
5
12345
54321
5
12345
14235
Sample Output:
yes
no
PS:模拟出栈的过程,需要用到一个辅助的栈。通过出栈的元素与入栈队列匹配,将当前入栈的箱子加入辅助栈,如果当前辅助栈的栈顶与当前要出栈的元素相同,则弹出辅助栈的栈顶元素。否则将入栈队列的元素入栈。
举个粟子:入栈为1 2 3 4 5 6 出栈为 3 2 1 5 4 6 当出栈的第一个元素为3时,这时候判断入栈队列的哪些元素是应该加入到辅助栈中的。显然1,2需要加入到辅助栈中因为他们与3不相等。此时辅助栈中就有1,2的元素,当出栈的元素为2时,此时与栈顶元素相同,辅助栈的2出栈,同理1出栈。

#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool is_outstack_right(string &stackin, string &stackout)
{
    int length = stackin.length();
    stack<char> fuzhu; //辅助栈
    int index = 0; //指向当前匹配入栈的下标
    for(int i = 0; i < length; i++){//遍历出栈序列
        if(!fuzhu.empty() && fuzhu.top() == stackout[i]){
            //如果辅助栈非空,而且遍历元素是当前辅助栈的栈顶元素
            fuzhu.pop();
        }
        else{//辅助栈为空,或者当前出栈的元素不等于栈顶元素,
            while(index < length && stackin[index] != stackout[i])
                fuzhu.push(stackin[index++]);
            if(index == length) return false;
            else index++;
        }
    }
    return true;
}
int main()
{
    ios::sync_with_stdio(false);
    int n;
    string in, out;
    while(cin>>n)
    {
        cin>> in >> out;

        bool ans = is_outstack_right(in, out);
        if(ans) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值