剑指-面试题31 栈的压入、弹出序列

栈的压入、弹出序列

题目
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

思路:
辅助栈+贪心算法
持续将pushed的元素入栈,然后每次都判断栈顶元素等于待出栈元素(poped),如果最后还剩元素则false。


总结:
列表获取尾元素用list[-1]

C++

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        int n=popped.size();
        int m=pushed.size();
        if (n!=m)
            return false;
        stack<int> help_stack;
        int j=0;
        for(int i=0; i<m; ++i)                      //持续将pushed里的元素入栈,如果判断栈顶元素等于待出栈元素,则出栈
        {
            help_stack.push(pushed[i]);
            while(!help_stack.empty() && popped[j]==help_stack.top())
            {
                help_stack.pop();
                j++;
            }
        }
        return help_stack.empty();
    }
};

python

class Solution:
    def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
        n = len(popped)
        m = len(pushed)
        if m!=n:
            return false;
        help_stack = []
        j = 0                   # poped计数
        for i in range(0, m):
            help_stack.append(pushed[i])
            while len(help_stack)!=0 and help_stack[-1]==popped[j]:
                help_stack.pop()
                j +=1
        return not len(help_stack)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值