其他分享
首页 > 其他分享> > 剑指offer31.栈的压入、弹出

剑指offer31.栈的压入、弹出

作者:互联网

剑指offer31.栈的压入、弹出

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof

示例:

输入: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


解题思路:

  1. 需利用栈的结构特点(先进后出)
  2. 根据poped[]数组元素,如第一个4,那依据压栈顺序,需要先将1、2、3压栈,然后再压入4时,发现4与poped[0]相等,则将栈内的4弹出(pop),与此同时,poped[]继续往后遍历一位来到5,此时查看栈顶元素是否与5匹配,匹配则将5从栈中弹出,pop[]再往后走一位。只要两个数组能匹配起来,就一定能符合上述规律。
  3. 分析一下不匹配时的情形:依据pushed[]数组元素的顺序进行压栈,如不匹配,则会在某一个poped[j]上“卡壳”,就是说:第一栈顶元素不匹配,并且一直依据压栈顺序去继续压栈也找不到能匹配的数,直至pushed[]数组遍历结束。不管怎么样,栈内的元素在不匹配的情况下是不可能全部弹出的。
class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack=new Stack<>();
        int j=0;
        for(int i=0;i<pushed.length;i++){
            stack.push(pushed[i]);//拿到元素第一件事,先压栈

            while(j<popped.length&&!stack.isEmpty()&&stack.peek()==popped[j]){
                stack.pop();
                j++;
            }//压栈后,检查此刻的栈顶元素能否匹配,可以那就pop,并且可连续pop
        }
        return stack.isEmpty();//依据压栈顺序去遍历pushed[],遍历结束,且栈也为空,那就是两个数组
        //能匹配的上,否则就是匹配不上
    }
}

标签:匹配,压入,offer31,压栈,pop,pushed,push,序列
来源: https://blog.csdn.net/weixin_55667484/article/details/122735508