【每日一题】Day7 栈的压入、弹出序列

本题来源于牛客网中,链接如下:[编程题]栈的压入、弹出序列

Day7 栈的压入、弹出序列

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 的所有数字均不相同

输入描述:

两组数组数据

输出描述:

true或者false

示例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.解题思路

【题目解析】:

这道题目考的就是栈的压入、弹出序列,也就是栈的特性,在平时我们都会看见类似这种的选择题,只需要试一下对比一下就可以得到答案了,而代码也是一样,循环对比,就可以解出来了,首先我们了解一下这种类型的题目:

这种就是选择题类型的,在做这些题目之前我们需要先了解栈的特性:

栈的元素是先入后出的,并且随时可以选择存或者取。

所以这道题目中,答案是C:

比如1选项中的,是可以把A B C D E都存储,然后再取的时候,根据先入后出的顺序,就是E D C B A了,所以1可以。

然后对于2选项,我们是先存A B C D,然后取出D C,然后放EE,最后再取出B A,顺序也是可以的D E C B A,选项2正确。

对于选项3这种,先存A B C D,然后取出D C,然后放EE,最后取的时候,根据先入后出顺序,并不可能在取出B之前能取出A,所以选项3错误。

选项4也是一样可以的。

【解题思路】:

所以对于这种题目的解题思路,基本上是和选择题一样的,对于入栈顺序和出栈顺序的两个数组,我们用循环来对比,先按入栈顺序往栈上放一个元素,然后看出栈顺序的第一个是否和栈顶元素一致,如果一样就出栈,不一样就继续按入栈顺序放下一个元素。一直对比,直到入栈放完,也就是循环结束,判断栈中是否还有元素,有就是没出完,也就是这种出栈方法不可能,没有则是可以完成的顺序。

注意:我们在出栈的时候,可能出完一个之后下一个出栈元素也在栈上了,所以在判断出栈的时候可以用while循环。


3.参考代码

import java.util.*;

public class Solution {
    
    

    public boolean IsPopOrder(int [] pushA,int [] popA) {
    
    
        Stack<Integer> stack = new Stack<>();
        //创建栈
        int j = 0;
        for (int i = 0; i < pushA.length; i++) {
    
    
            stack.push(pushA[i]);//入栈
                while(j<popA.length && !stack.empty() && stack.peek() == popA[j]){
    
    
                //判断下标不越界以及栈不为空的情况下,看栈顶元素是否和出栈元素一致
                    stack.pop();//一致就出栈
                    j++;//有请下一位出栈者
                }
            }
        return stack.empty();//最后判断栈是否为空
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_54225715/article/details/124644406