力扣 946 洛谷 P4387 验证栈序列 (java实现)

在这里插入图片描述

    这里借助了辅助栈,将元素入栈,然后当碰到栈顶元素与poped数组中的元素相同,就把这个数pop出来,有个计数器计算栈顶元素与poped的元素相同的个数,如果个数等于pushed的长度,就返回true,否则返回fasle。

class Solution {
    
    
    public boolean validateStackSequences(int[] pushed, int[] popped) {
    
    
        int N = pushed.length;
        Stack<Integer> stack = new Stack();
        int j = 0;
        for (int x: pushed) {
    
    
            stack.push(x);
            while (!stack.isEmpty() && j < N && stack.peek() == popped[j]) {
    
    
                stack.pop();
                j++;
            }
        }
        return j == N;
    }
}

下面借助示例1,模拟一下整个过程。pushed=1,2,3,4,5 poped=4,5,3,2,1
    依次遍历pushed元素,入栈都是依次入的,所以就先将元素1入栈,发现1与poped的首元素4不同,则说明他没有出栈;到2,2入栈,2与4不同,2不需要出栈;继续到3,3入栈,3与4不同,不出栈;到4,4与4相同,所以4出栈,计数器j++,再重新到while循环,发现现在的peek是3,而j指向的元素是5,所以不进入while循环,走外面的for循环;这时候到5,5先入栈,栈顶元素是5,5与poped[j]相同,所以5出栈,计数器j++;然后继续while循环,栈顶元素为3,3与poped[j]相同,所以继续出栈,j++,后面依次,直到栈空。最后j就是记录pop了几次,如果元素pop完了,j就与pushed的长度相等,就说明这个序列是栈序列。

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121099224