力扣每日一题2022-08-31中等题:验证栈序列

验证栈序列

    • 题目描述
    • 思路
      • 模拟
        • Python实现
        • Java实现
        • C++实现


题目描述

验证栈序列


思路

模拟

根据题意,pushed和popped两个数组有如下性质:

  • 数组pushed的元素互不相同;
  • 两个数组长度一致;
  • popped数组是pushed数组的一种排列方式。
    根据这些性质,有如下结论:
  • 实现时,栈中不可能出现重复元素;
  • 如果pushed和popped是有效的栈操作序列,则经过所有的入栈出栈操作后,每个元素各入栈出栈一次,栈为空。
    因此,可以遍历两个数组,模拟入栈和出栈操作,判断两个数组是否为有效的栈操作序列。
    模拟入栈操作可以通过pushed数组实现,由于只有栈顶元素可以出栈,因此模拟出栈操作需要判断栈顶元素是否与popped数组当前元素相同,如果相同则将栈顶元素出栈。由于元素互不相同,因此当栈顶元素与popped数组的当前元素相同时,必须将栈顶元素出栈,否则出栈顺序一定和popped数组不同。
    所以具体的操作应为:遍历pushed数组,将pushed数组依次入栈后,如果栈不为空且栈顶元素与popped数组的当前元素相同,则将栈顶元素出栈,同时遍历popped数组,直到栈为空或栈顶元素与popped数组的当前元素不同。遍历pushed数组结束后,每个元素都按照pushed数组的顺序入栈一次。如果栈为空,则每个元素都按照数组popped的顺序出栈返回true,如果栈不为空,则元素不能按照popped数组的顺序出栈,返回false。
Python实现
class Solution:
    def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
        s, i = [], 0
        for x in pushed:
            s.append(x)
            while s and s[-1] == popped[i]:
                s.pop()
                i += 1
        return len(s) == 0
Java实现
class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Deque<Integer> stack = new ArrayDeque<Integer>();
        int n = pushed.length;
        for (int i = 0, j = 0; i < n; i++) {
            stack.push(pushed[i]);
            while (!stack.isEmpty() && stack.peek() == popped[j]) {
                stack.pop();
                j++;
            }
        }
        return stack.isEmpty();
    }
}
C++实现
class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> st;
        int n = pushed.size();
        for (int i = 0, j = 0; i < n; i++) {
            st.emplace(pushed[i]);
            while (!st.empty() && st.top() == popped[j]) {
                st.pop();
                j++;
            }
        }
        return st.empty();
    }
};

你可能感兴趣的:(leetcode每日一题,leetcode,python,java,c++)