力扣 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的长度相等,就说明这个序列是栈序列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值