栈混洗

栈混洗的概念

1518202-20190411143240729-603038161.png

A中的元素经S的中转后压入B中,其间,只允许从A弹出压入S或者从S弹出压入BA中元素全部转移到B中即完成一次栈混洗操作

栈混洗的甄别

1518202-20190411144404513-1842932684.png

对于这个问题主要就是模拟一次栈混洗来解决,即每次S.pop()之前检测S是否已空,或需要弹出的元素在S中却不是顶元素

代码实现

#include "../head.h"
#include <stack>

bool stackPermutation(stack<int> &A, stack<int> &B) {
    stack<int> S, temp;
    while (!B.empty()) {
        temp.push(B.top());
        B.pop();
    }
    while (!A.empty()) {
        S.push(A.top());
        A.pop();
        if (temp.top() == S.top()) {
            temp.pop();
            S.pop();
            while (!S.empty()) {
                if (temp.top() == S.top()) {
                    temp.pop();
                    S.pop();
                }
                else return false;
            }
        }
    }
    return S.empty();
}


int main(int argc, char** argv) {
    stack<int> a, b;
    int ta, tb;
    cout << "the base stack [--->: [";
    while (cin >> ta)
        a.push(ta);
    if (cin.eof())
        cout << "endoffile";
    cin.clear();
    cout << endl;
    cout << "the test stack [--->: [";
    while (cin >> tb)
        b.push(tb);
    if (stackPermutation(a, b)) 
        cout << "true" << endl;
    else cout << "false" << endl;
    return 0;
}

stackPermutation()函数的逻辑是先将待测试栈B一个个弹出到一个临时栈temp中,此时temp的栈顶就是原来B的栈底,这样就可以比较容易的来模拟一次栈混洗(因为标准库的栈容器没有下标运算符,只能出此下策),接下来以A非空为判断标准,一次一个的将元素弹出并压入S中,然后把temp的栈顶元素与刚压入S的元素(刚压入嘛,肯定是栈顶)相比较,如果相同,tempS同时弹出这个相同的元素,接下来如果S是非空,则说明接下来S的每个元素与temp的元素相同且一一对应,所以接下来以S非空为判断标准,比较一次,弹出一次,一旦有不相等,则说明待测试栈不是给定栈的栈混洗,返回false,还有一种十分特殊的情况,如果B的栈底元素(也就是temp的栈顶元素)在A中根本就没有,即使A全部弹出,也不会触发循环里面的return false,所以,最后要用S是否为空作为判断依据返回

这里还有个小插曲,main函数里面第一次cin结束按<C-d>后将cin流的eofbit置位了,所以后面那个cin怎么也输入不了,程序总是报段错误(猜测与cin.eof()的条件判断吻合),需要将cin流状态复位才能继续输入

转载于:https://www.cnblogs.com/Anthony-ling/p/10689563.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值