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

文章目录

    • 1. 题目来源
    • 2. 题目说明
    • 3. 题目解析
          • 方法一:建立辅助栈、模拟出栈

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();
    }
};

你可能感兴趣的:(每日一题)