验证栈序列

验证栈的入栈顺序和出栈顺序

题目

(1)给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
(2)示例如下:
输入: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

解决思路

  • 题意分析:题意即验证能否根据pushed的入栈顺序得到poped的出栈顺序,若能则返回true,若不能则返回false。
  • 思路:
    • 验证栈序列时只需关注出栈序列,出栈序列的每个元素应等于入栈序列的当前栈顶元素或未来要进入栈的元素。
    • 如果当前出栈序列的元素不等于入栈序列的栈顶元素且也不等于未来某个要入栈的元素,则不能根据入栈序列顺序得到出栈序列,则返回false。
  • 具体方法:
    • 第一步:用 j 表示pushed的索引,初始化 j = 0,将pushed中的第 j 个元素pushed[j]转入栈s中。
    • 第二步:用 i 表示poped的索引,初始化 i = 0,判断栈s的栈顶元素是否等于poped的当前元素poped[i]。如果不相等则将pushed的下一个元素pushed[++j]转移到站s中;如果相等,则将栈s的栈顶元素弹出。
    • 重复上述两步,直到结束。

代码

  • C++代码
# include <stdio.h>
# include <vector>
# include <stack>

using namespace std;


class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> s;   // 存储pushed中的元素,将pushed中的元素转移到栈s中。

        // i表示出栈序列中的第i位,j表示入栈序列中的第j位。
        int j = 0;
        for (int i = 0; i < popped.size(); i++) {
            // 将栈pushed中的元素转移到栈s中。
            // 判断栈s的栈顶元素是不是当前出栈序列对应的元素,如果不是,则将栈pushed对应位置的元素转移到站s中。
            while (j < pushed.size() && (s.empty() ||  s.top() != popped[i])) {
                s.push(pushed[j]);
                j++;
            }
            // 判断栈顶元素是否等于出栈序列当前元素。
            if (popped[i] != s.top()) {
                return false;
            }

            // 当栈s的栈顶元素等于出栈序列对应的元素时,就从栈s中弹出栈顶元素。
            s.pop();
        }
        return true;
    }
};


int main() {
    Solution *solution = new Solution();
    vector<int> pushed = {1,2,3,4,5};
    vector<int> popped = {4,5,3,2,1};
    printf("%d\n", solution->validateStackSequences(pushed, popped));
    return 0;
}
  • Python代码
# -*- coding: utf-8 -*-

from typing import List


class Solution:
    def __init__(self):
        pass

    def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
        s: List[int] = []   # 存储pushed中的元素,将pushed中的元素转移到栈s中。
        j: int = 0          # j表示入栈序列中的第j位。

        for num in popped:
            # 将栈pushed中的元素转移到栈s中。
            # 判断栈s的栈顶元素是不是当前出栈序列对应的元素,如果不是,则将栈pushed对应位置的元素转移到站s中。
            while j < len(pushed) and (0 == len(s) or s[-1] != num):
                s.append(pushed[j])
                j += 1

            # 判断栈s的栈顶元素是否等于出栈序列当前元素。
            if s[-1] != num:
                return False

            # 当栈s的栈顶元素等于出栈序列对应的元素时,就从栈s中弹出栈顶元素。
            s.pop()

        return True


def main():
    solution = Solution()
    pushed = [1, 2, 3, 4, 5]
    popped = [4, 5, 3, 2, 1]
    print(solution.validateStackSequences(pushed, popped))


if __name__ == "__main__":
    main()

说明

  • 对应LeetCode第946题。
  • 链接:https://leetcode-cn.com/problems/validate-stack-sequences/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值