[每日一题] 138. 验证栈序列(数组、栈、模拟)

1. 题目来源

链接:验证栈序列
来源:LeetCode

2. 题目说明

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

示例1:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

示例2:

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

提示:

  1. 0 <= pushed.length == popped.length <= 1000
  2. 0 <= pushed[i], popped[i] < 1000
  3. pushedpopped的排列。

3. 题目解析

方法一:建立辅助栈、模拟出栈

建立两个栈进行模拟出栈操作,先将 popped倒序全部压入栈s2中,再针对 pushed进行顺序逐个压入栈s1,并在循环内部判断,该压入元素即 s1.top()是否等于 s2.top(),在此需要采用while循环判断,若在 while内部栈 s1为空,应当直接 break跳出 while循环,否则再进行while循环判断s1.top()出错。当 for循环结束后意味着所有元素都已经完成了压栈操作,若栈 s1 为空,则模拟出栈成功,否则失败,在此直接返回s1.empty()即可,由于pushedpopped的排列,返回s1.empty()也可。

参见代码如下:

// 执行用时 :8 ms, 在所有 C++ 提交中击败了93.62%的用户
// 内存消耗 :9.6 MB, 在所有 C++ 提交中击败了5.30%的用户

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> s1, s2;
        for (int i = popped.size() - 1; i >= 0; --i) 
            s2.push(popped[i]);
        for (int i = 0; i < pushed.size(); ++i) {
            s1.push(pushed[i]);
            while (s2.top() == s1.top()) { 
                s1.pop();
                s2.pop();
                if (s1.empty()) 
                    break;
            }
        }
        return s1.empty();
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值