给定入栈序列,判断出栈序列的正确性

我们常见的一类如栈出栈的题目就是这种,那我们肯定是先从定义下手

栈就相当于一个只有一个口的盒子,我们先放进去的东西在底层只能后拿出来,相反的,后放进去的东西在上层,我们可以直接取出,这就是栈的特性“先进后出,后进先出”。
那么接下里我们直接入手案例:

序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是否是该压栈序列对应的一个弹出序列

答案是:是的
因为顺序可能是,先压入1,2,3,4,然后弹出队首元素4,此时再次压入5,然后依次弹出栈中的元素,此时的出栈顺序就是4,5,3,2,1

再举一个反例:

序列1,2,3,4,5是某栈的压入顺序,序列4,3,5,1,2是否是对应的弹出序列

这个问题的答案是:否
按照刚刚的思路来的话就是,1,2,3,4入栈,然后4,3依次出栈,5入栈后栈中元素自底向上依次是1,2,5,所以5出栈后不可能是1出栈,因为此时的栈顶元素是2

总结

从上面的案例中,我们可以总结出一个规律:

每一个栈中元素出栈时机都有两种:
1.序列中间的某一个元素刚入栈就出栈,此时我们可以依次出栈或继续将后面元素入栈。
2.序列中的元素全部入栈后,栈顶元素依次出栈
所以:
当我们确定一个出栈元素后,后面出栈的元素中 <在该元素之前入栈> 的元素的出栈顺序必须与入栈时的顺序相反,否则该出栈序列不可能是该入栈序列的出栈序列。

最后附上java代码

import java.util.ArrayList;
import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        int i=0;
        Stack<Integer> stack= new Stack<>();
        for(int item : pushA){
            stack.push(item);
            while(!stack.empty() && stack.peek()==popA[i]){
                stack.pop();
                i++;
            }
        }
        return stack.empty();
    }
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值