剑指Offer31.栈的压入,弹出序列

  • 剑指Offer31.栈的压入,弹出序列

  • 题目:
    给定两个序列,一个入栈序列pushed,一个出栈序列poped,且poped是pushed的排列,判断他们是否合法?
    序列中的元素值不相等;

  • 思路:
    1.一对pushed和poped序列,只会对应一种实际出入栈操作:例如pushed = [ 1,2,3,4,5 ],poped = [ 4,5,3,2,1 ];先依次入栈1,2,3,4,此时必须pop4,如果此时不弹出,继续入栈的话,4的上面就会盖上其它数,由于先进后出的特点,无论如何poped序列的第一个也不可能是4了,因此每个数该被弹出的时候必须立刻弹出,不能拖延;因此,如果一对pushed和poped有效的话(即return true),那么它们只会对应一种实际操作;
    2.我们要做的是去模拟出这种操作;

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        int m = pushed.size(), n = popped.size();
        if (!m && !n) return true;//都为空
        else if (!m || !n || m != n) return false;//只有一个为空,或 都不为空但长度不同

        stack<int> stk;
        int j = 0;//用于表示接下来该弹出poped序列中的哪一个了
        for (int i = 0; i < m; ++i) {//每入栈一个数,都弹到不能弹出为止,即确保该弹的时候一定都能弹出来
            stk.push(pushed[i]);
            while (!stk.empty() && stk.top() == popped[j]) {//时刻尝试弹出poped[i],一旦能弹出,立刻弹出
                stk.pop();
                ++j;
            }
        }
        return stk.empty(); //若栈为空,说明push了所有数,且全部pop出来了
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值