剑指offer-22:栈的压入弹出序列

输入两个整数序列,第一个表示压栈顺序,判断第二个序列是否为该栈的弹出序列?

分析

  • 此题解法就是人判断时的做法。想想人工判断时的步骤,先设一个辅助栈。
  • 大循环:弹出序列完成
  • 初始栈为空,按照压栈顺序压入。当栈顶元素不等于弹出序列顶时,继续压栈。直至压栈顺序压完,或者当前栈顶和弹出序列顶相同
  • 出小循环,判断哪种情况出来的。如果栈顶和弹出序列顶不同,说明没等到,跳出大循环。否则属于遇到相等的,则栈顶弹出。弹出序列顶++
  • 最终判断:栈空且弹出序列完成。

代码:

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {

        bool res = false;

        vector<int>::iterator pnextpush = pushV.begin();
        vector<int>::iterator pnextpop  = popV.begin();

        stack<int> s;

        // 当弹出序列没完时
        while(pnextpop != popV.end())
        {
            // 初始栈空或栈顶不是弹出序列顶时,压栈
            while(s.empty() || s.top() != *pnextpop)
            {
                // 压栈序列完了,跳出
                if(pnextpush == pushV.end())
                    break;
                s.push(*pnextpush);
                pnextpush++;
            }
            // 栈顶不等于弹出序列顶,则跳出
            if(s.top() != *pnextpop)
                break;
            // 弹栈,第一个序列匹配
            s.pop();
            pnextpop++;
        }
        // 弹出序列弹完,且栈为空,说明匹配
        if(s.empty() && pnextpop==popV.end())
            res = true;

        return res;
    }
};

// 测试
int _tmain(int argc, _TCHAR* argv[])
{
    int i,tmp;
    vector<int> push;
    vector<int> pop;
    for(i=0;i<5;++i)
    {   
        cin >> tmp;
        push.push_back(tmp);
    }
    for(i=0;i<5;++i)
    {   
        cin >> tmp;
        pop.push_back(tmp);
    }
    Solution s;
    cout << s.IsPopOrder(push, pop) << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值