剑指 Offer 31. 栈的压入、弹出序列 && Leetcode 946. 验证栈序列

地址  https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/

复制代码
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。   示例 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 之前弹出。   提示: 0 <= pushed.length == popped.length <= 1000 0 <= pushed[i], popped[i] < 1000 pushed 是 popped 的排列。 注意:本题与主站 946 题相同:https://leetcode-cn.com/problems/validate-stack-sequences/
复制代码

解答 

我们使用一个stack数据结构来模拟即可。

由于栈的本身是先入后出而且只能弹出栈顶元素,题目也提到压入栈的元素都不相等。

那么弹出的执行只能在压入该元素且没有压入其他元素时候进行操作。

也就是该元素刚刚压入栈在栈顶的时候,且该元素也是pop序列的当前元素,我们将它弹出

既然没有分支没有其他选择,我们进行模拟该操作,查看最后能否弹出全部元素即可

图示

 1 

2

3

4

 

复制代码
class Solution {
public:
    stack<int> st;
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        int popidx = 0;
        for(int i = 0; i < pushed.size();i++ ){
            while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){
                st.pop();popidx++;
            }
            st.push(pushed[i]);
        }
        while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){
                st.pop();popidx++;
        }

        return st.empty();
    }
};
复制代码

 

posted on   itdef  阅读(104)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示