剑指Offer(第2版)——面试题31:栈的压入、弹出序列

题目:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列{1,2,3,4,5}是某栈的压入序列,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

1.解题思路:

  • 可以构造一个辅助栈,按照第一个序列的顺序将数字逐个压入辅助栈,同时参考第二个序列的顺序不时地弹出相应的数字,如果两个序列都能按照顺序进行完压入和弹出的操作,则第二个序列是该栈的弹出顺序;
  • 如果第二个序列下一个弹出的数字刚好是辅助栈的栈顶数字,则直接弹出;
  • 如果第二个序列下一个弹出的数字不在辅助栈的栈顶,则继续压入第一个序列中未压入的数字,直到把下一个弹出的数字压入为止;
  • 如果第一个序列的所有数字压入辅助栈后仍然没有找到下一个弹出的数字,那么第二个序列不是该栈的弹出序列。

牛客网通过,leetcode不通过!

2.代码:

class Solution{
public:
    bool IsPopOrder(vector<int> pushV, vector<int> popV){
        //第一个序列为空
        if(pushV.size() == 0) return false;
        //向辅助栈压入和弹出数据
        for(int i = 0, j = 0; i < pushV.size(); i++){
            //将第一个序列压入辅助栈
            stackData.push(pushV[i]);
            //当辅助栈的栈顶等于第二个序列下一个弹出数字时,直接弹出
            while(j < popV.size() && stackData.top() == popV[j]){
                stackData.pop();
                j++;
            }
        }
        //判断辅助栈是否全部弹出,
        return stackData.empty();
    }
private:
    stack<int> stackData;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值