【OJ - stack】栈的压入、弹出序列

OJ - 栈的压入、弹出序列

题目难度:中等

OJ链接:栈的压入、弹出序列__牛客网 (nowcoder.com)

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

  1. 0 <= pushV.length == popV.length <= 1000

  2. -1000 <= pushV[i] <= 1000

  3. pushV 的所有数字均不相同


解题思路

题目给了一个入栈序列和出栈序列,我们定义一个栈,根据给的入栈和出栈顺序,来模拟入栈和出栈即可。

  • 定义 pushi 和 popi 分别指向入栈序列和出栈序列的第一个元素,遍历序列。
  • 依次遍历入栈序列 pushV 中的元素,向 st 中入栈:
    • 如果 st 不为空,将 st 的栈顶元素和出栈序列 popV 中的元素进行比较:
      • 如果相等,说明 st 的栈顶元素需要出栈了。
      • 如果不相等,说明 st 的栈顶元素不需要出栈。
    • 如果 st 为空,说明需要继续遍历入栈序列 pushV 中的元素,向 st 中入栈。
  • 上面循环结束后,如果 st 为空,说明入栈序列和出栈序列匹配成功,返回 true。
image-20220519153407855
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        stack<int> st; // 定义一个栈
        size_t pushi = 0, popi = 0; // 指向入栈序列和出栈序列的第一个元素
        
        // 遍历入栈序列
        while (pushi < pushV.size()) {
            st.push(pushV[pushi++]); // 将入栈序列的第pushi个元素入栈
            
            // 遍历出栈序列,判断此时是否有元素需要出栈
            // 如果栈不为空,且栈顶元素等于出栈序列的第popi个元素,说明第popi个元素需要出栈
            while (!st.empty() && st.top() == popV[popi]) {
                st.pop(); // 出栈
                popi++;   // 遍历出栈序列的下一个元素,判断其是否需要出栈
            }
        }
        
        return st.empty(); // st为空,说明入栈序列和出栈序列中的元素全都被遍历完了,匹配成功
        // return popi == popV.size(); // 出栈序列被遍历完了,说明入栈序列和出栈序列匹配成功
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值