栈的压入、弹出序列

通过模拟栈操作,判断给定的 popV 是否可能是 pushV 的合法出栈序列。它通过逐个入栈 pushV 的元素,并同时检查栈顶元素是否与 popV 当前元素匹配,从而进行出栈操作。如果最终栈为空,说明 popV 是合法的出栈序列;否则不合法。

代码:

class Solution {
public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        stack<int> s;
        int pos1 = 0, pos2 = 0;
        while (pos1 < pushV.size()) { 
            // 将 pushV[pos1] 入栈,并将 pos1 递增
            s.push(pushV[pos1++]);

            // 检查栈顶元素是否与 popV[pos2] 相等,如果相等则弹出栈顶元素并递增 pos2
            while (pos2 < popV.size() && !s.empty() && s.top() == popV[pos2]) {
                s.pop();
                pos2++;
            }   
        }

        // 如果栈为空,说明所有元素都成功匹配,返回 true,否则返回 false
        return s.empty();
    }
};

详细解释

  1. 输入参数:

    • pushV 是一个整型向量,表示入栈顺序。
    • popV 是一个整型向量,表示出栈顺序。
    • 函数返回一个布尔值,表示 popV 是否是 pushV 的可能的弹出顺序。
  2. 栈的使用:

    stack<int> s; 声明一个栈 s 用来模拟实际的压入和弹出操作。
  3. 指针/索引:

    • pos1 指向当前处理的 pushV 元素的位置。
    • pos2 指向当前处理的 popV 元素的位置。
  4. 入栈操作:

    while(pos1 < pushV.size()) 中,将 pushV[pos1] 对应的元素入栈,同时将 pos1 加 1。
  5. 匹配出栈顺序:

    • 在内层 while 循环中,代码检查以下条件:
      • popV[pos2] 是否等于栈顶元素 s.top()
      • 如果相等,则栈顶元素出栈(使用 s.pop()),并将 pos2 加 1,处理下一个元素。
    • 这个过程会不断重复,直到当前的栈顶元素无法与 popV[pos2] 匹配,或者栈为空。
  6. 最后返回结果:

    return s.empty(); 用于判断栈是否为空。如果 popVpushV 的一个有效弹出序列,那么所有的元素都应该被匹配并且出栈,此时栈为空,返回 true。否则返回 false

示例

举个例子,如果输入如下:

  • pushV = [1, 2, 3, 4, 5]
  • popV = [4, 5, 3, 2, 1]

代码将模拟栈操作,最终栈会为空,说明 popV 是一个可能的弹出序列,返回 true

但如果 popV = [4, 3, 5, 1, 2],经过模拟操作后栈不会为空,返回 false,因为这个序列不是 pushV 的可能弹出序列。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值