春招打卡|栈的压入弹出序列

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

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

提示:

0 <= pushed.length == popped.length <= 1000 0 <= pushed[i], popped[i] < 1000 pushed 是 popped 的排列。

二、思路分析

  1. 考虑模拟入栈出栈过程解决该问题。
  2. 开启一个栈,并且用j表示当前出栈数组遍历到第几个。
  3. 遍历入栈数组,向栈中添加元素,如果栈中最后一个元素与popped[j]相同,则说明匹配出栈序列成功,如果栈顶元素仍然与出栈数组当前元素相同,则一直出栈。
  4. 最后栈中元素可以全部出栈成功,意味着与出栈序列完全匹配。

三、AC 代码

func validateStackSequences(pushed []int, popped []int) bool {
    stack := make([]int,0)
    j := 0
    for i := range pushed {
        stack = append(stack,pushed[i])
        for len(stack) > 0 && stack[len(stack)-1] == popped[j] {
            stack = stack[:len(stack)-1]
            j++
        }
    }
    return len(stack) == 0
}
复制代码

四、总结

这是一道栈相关题目,可以通过模拟的方式模拟入栈出栈过程,并与相应的数组匹配。

おすすめ

転載: juejin.im/post/7076351668786462728
おすすめ