2021-5-2 剑指 Offer 31. 栈的压入、弹出序列(辅助栈)

2021/5/2 18:25:31

本文主要是介绍2021-5-2 剑指 Offer 31. 栈的压入、弹出序列(辅助栈),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

注:

题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {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 的排列。

题解:
解题思路
如下图所示,给定一个压入序列 pushedpushed 和弹出序列
poppedpopped ,则压入 / 弹出操作的顺序(即排列)是 唯一确定 的。
在这里插入图片描述
如下图所示,栈的数据操作具有 先入后出 的特性,因此某些弹出序列是无法实现的。
在这里插入图片描述
考虑借用一个辅助栈 stack,模拟 压入 / 弹出操作的排列。根据是否模拟成功,即可得到结果。

入栈操作: 按照压栈序列的顺序执行。
出栈操作: 每次入栈后,循环判断 “栈顶元素 ==弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。
由于题目规定 栈的所有数字均不相等 ,因此在循环入栈中,每个元素出栈的位置的可能性是唯一的(若有重复数字,则具有多个可出栈的位置)。因而,在遇到 “栈顶元素 == 弹出序列的当前元素” 就应立即执行出栈。

算法流程
初始化: 辅助栈 stack ,弹出序列的索引 i ;
遍历压栈序列: 各元素记为 num ;
元素 num 入栈;
循环出栈:若 stack 的栈顶元素 == 弹出序列元素 popped[i] ,则执行出栈与 i++ ;
返回值: 若stack 为空,则此弹出序列合法。

复杂度分析
时间复杂度 O(N) : 其中 N 为列表 pushed 的长度;每个元素最多入栈与出栈一次,即最多共 2N 次出入栈操作。
空间复杂度 O(N) : 辅助栈 stack 最多同时存储 N 个元素。

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> nums;
        int index=0;
        for(int num:pushed){
            nums.push(num);
            while(!nums.empty()&&nums.top()==popped[index]){
                nums.pop();
                index++;
            }
        }
        return nums.empty();
    }
};


这篇关于2021-5-2 剑指 Offer 31. 栈的压入、弹出序列(辅助栈)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程