Java栈的压入、弹出序列(详解)

目录

1.题目描述

2.题解

方法1

方法2


1.题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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,2,3,4,5],[4,5,3,2,1]

返回:true

输入:[1,2,3,4,5],[4,3,5,1,2]

返回:false

2.题解

方法1

思路分析:

判断两个序列是否符合入栈、出栈的次序,我们可以使用一个栈来模拟。

入栈:栈顶元素不等于出栈序列当前元素

出栈:栈顶元素等于出栈序列当前元素

具体过程:

 具体实现:

1.创建一个栈,来模拟入栈、出栈次序

2.使用i、j来遍历pushV、popV数组,i < pushV.length,入栈

3.栈顶元素等于popV数组当前元素时,出栈

4.遍历完pushV数组后,判断栈是否为空,栈为空,弹出序列为正确的出栈顺序;反之,则为错误的出栈顺序

代码实现:

public class Solution {
    public boolean IsPopOrder (int[] pushV, int[] popV) {
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        for (int i = 0; i < pushV.length; i++) {
            stack.push(pushV[i]);
            //判断是否有元素出栈
            while(j < popV.length && !stack.empty()){
                int k = stack.peek();
                if(k == popV[j]){
                    stack.pop();
                    j++;
                }else{
                    break;
                }
            }
        }
        return stack.empty();
    }
}

方法2

思路分析:

由于数组本身就可用于实现栈,我们可以将pushV数组当作栈,使用p来标记栈顶,

入栈:pushV[p](栈顶元素)不等于当前出栈数组中元素,p++(入栈)

出栈:pushV[p](栈顶元素)等于当前出栈数组中元素,p--(出栈)

具体过程:

具体实现:

1.使用p来标识栈顶元素

2.使用i、j来遍历pushV、popV数组,pushV[p](栈顶元素)不等于当前出栈数组中元素,

pushV[p] = pushV[i],p++

3.pushV[p](栈顶元素)等于当前出栈数组中元素,p--

4.遍历完pushV数组后,判断p的大小,若p为0,则表示所有元素都已出栈,出栈序列为正确的出栈顺序,返回true,否则,返回false

代码实现:

public class Solution {
    public boolean IsPopOrder (int[] pushV, int[] popV) {
        int p = 0;//标识栈顶
        int j = 0;//出栈序列下标
        for(int n : pushV){
            pushV[p] = n;
            while( p>=0 && j < popV.length && pushV[p] == popV[j]){
                j++;
                p--;
            }
            p++;
        }
        return p==0;
    }
}

题目来自:

栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

猜你喜欢

转载自blog.csdn.net/2301_76161469/article/details/133418172