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


题目描述

验证栈序列


思路

模拟

根据题意,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();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值