【牛客网】:AB2 栈的压入、弹出序列(JAVA版)

该博客讨论了如何判断给定的两个整数序列是否符合栈的压入、弹出顺序。通过模拟栈操作,检查是否能从压入序列得到弹出序列。文章提供了两种解法,一种是批量压入多个元素,另一种是每次只压入一个元素,并给出了详细的代码实现。最后总结了问题解决的关键在于正确模拟栈操作和场景重现。
摘要由CSDN通过智能技术生成

每日算法——AB2 栈的压入、弹出序列


一、题目要求

1.题目描述

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

  • 0<=pushV.length == popV.length <=1000
  • -1000<=pushV[i]<=1000
  • pushV 的所有数字均不相同

2.示例

示例1

输入:
[1,2,3,4,5],[4,5,3,2,1]
返回值:
true
说明:
可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true      

示例2

输入:
[1,2,3,4,5],[4,3,5,1,2]
返回值:
false
说明:
由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求435必须在12前压入,且12不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false      

二、涉及知识点


三、题目分析

最简单的情况,两个序列中的至少一个为空或两个序列长度不相等,那么直接就是False。
我们有压栈序列和出栈序列,那么我们就可以利用这两个序列进行来模拟整个入栈出栈过程

  • 正确的情况:

正确压栈弹栈的话,那么栈最后的结果肯定是栈为空

  • 错误的情况:

栈不为空,无法按照规定正确弹栈

四、题解

1.方法一(批量压入多个元素)

import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack<Integer> s=new Stack<>();
        int n=pushA.length;
//         遍历入栈数组
        int i=0;
//             遍历出栈数组
        for(int j=0;j<n;j++){
//             入栈数组还有剩余元素并且暂存栈为空或者栈顶元素不等于出栈数组元素
            while(i<n&&(s.isEmpty()||s.peek()!=popA[j])){
                s.push(pushA[i++]);
            }
//             退出只有两种情况:入栈数组遍历完成、栈顶元素等于出栈数组元素且暂存栈不为空
            if(s.peek()==popA[j]){
                s.pop();
            }else{
//                 所以其情况为暂存栈不为空且栈顶元素不等于出栈数组元素(无法出栈)
                return false;
            }
        }
        return true;
    }
}

2.方法二(每次只压入一个元素)

import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Stack<Integer> s=new Stack<>();
        int n=pushA.length;
//         遍历出栈数组
        int j=0;

//         遍历入栈数组
        for(int i=0;i<n;i++){
//             直接压栈
            s.push(pushA[i]);
//             栈不为空,且栈顶元素等于出栈元素,则进行出栈
            while(!s.isEmpty()&&s.peek()==popA[j]){
                s.pop();
                j++;
            }
        }
        return s.isEmpty();
    }
}

五、总结

  1. 判断是否成立的方法,可以是进行模拟,场景重现,能重现才正确,否则错误。
  2. 每个问题都可能有多种解法,性能的把握也很重要。
  3. 以内存换时间,有时候数据结构的意义就是为了更好的以空间换时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值