Java题目详解——牛客网JZ31.栈的压入,弹出序列

目录

题目链接:牛客网JZ31.栈的压入,弹出序列

一.题目要求

二.解题思路

三.具体代码

四.运行截图


题目链接:牛客网JZ31.栈的压入,弹出序列

一.题目要求

描述:

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

1. 0<=pushV.length == popV.length <=1000

2. -1000<=pushV[i]<=1000

3. pushV 的所有数字均不相同

示例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]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false。

二.解题思路

首先将把int[]转成ArrayList<Integer>,便于后续操作。

//把int[] 转成ArrayList<Integer>
List<Integer> pushAList=intArrayToList(pushA);
List<Integer> popAList=intArrayToList(popA);
private List<Integer> intArrayToList(int[] array){
    List<Integer> ans=new ArrayList<>();
    for(int e:array){
        ans.add(e);
    }
    return ans;
}

        我们能够知道这道题就是需要利用栈的结构特点来解答的,那我们就要想什么时候应该进行压栈操作,什么时候进行出栈操作,以及如何检查popA序列是否正确。

        popA序列本身就是一个 "不知道正确与否的" 出栈序列,所以我们应该操作pushA序列入栈,通过判断popA序列的元素与栈顶元素是否相同,如果相同,说明这步 "出栈" 操作是正确的;如果不同,继续将pushA中的元素入栈(当然,如果一开始栈为空的话,也要入栈)。

        如果在循环遍历中,pushA序列的元素比popA序列的元素先空,就说明有步骤出错了,即popA序列错误;如果能遍历完popA中的所有元素并不出错,就说明是正确的出栈序列。

以示例1画图理解:

三.具体代码

import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        if(pushA.length!=popA.length){
            return false;
        }

        //把int[] 转成ArrayList<Integer>
        List<Integer> pushAList=intArrayToList(pushA);
        List<Integer> popAList=intArrayToList(popA);
        
        Deque<Integer> stack=new LinkedList<>();

        while(!popAList.isEmpty()){
            int popE=popAList.remove(0);
            while(stack.isEmpty()||stack.peek()!=popE){
                if(pushAList.isEmpty()){
                    return false;
                }
                int pushE=pushAList.remove(0);
                stack.push(pushE);
            }
            
            stack.pop();
        }
        return true;
    }

    private List<Integer> intArrayToList(int[] array){
        List<Integer> ans=new ArrayList<>();
        for(int e:array){
            ans.add(e);
        }
        return ans;
    }
}

四.运行截图

如想了解栈(Stack)相关知识,请查阅:

数据结构☞栈和队列

如有建议或想法,欢迎一起讨论学习~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值