Offer[31] 栈的压入弹出序列

Posted haoworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Offer[31] 栈的压入弹出序列相关的知识,希望对你有一定的参考价值。

题目描述

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

牛客网刷题地址

思路分析

  1. 如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;
  2. 如果下一个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止;如果所有数字都压入栈后仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列

测试用例

  1. 功能测试:输入的两个数组含有多个数字或者只有一个数字;第二个数组是或者不是第一个数组表示的压入序列对应的栈的弹出序列。
  2. 特殊输入测试:输入两个nullptr指针。

Java代码

public class Offer31 
    public static void main(String[] args) 
        test1();
        test2();
        test3();

    

    public static boolean IsPopOrder(int[] pushA, int[] popA) 
        return Solution1(pushA,popA);
    

    private  static boolean Solution1(int[] pushA, int[] popA) 
        if(pushA==null || popA==null)
              return false;
            
            if(pushA.length!=popA.length || pushA.length==0)
              return false;
            
            Stack<Integer> stack = new Stack<Integer>();
            int popIndex  = 0;
            for(int pushIndex=0;pushIndex<pushA.length;pushIndex++)
                stack.push(pushA[pushIndex]);
                while(!stack.empty()&&stack.peek()==popA[popIndex])
                    stack.pop();
                    popIndex++;
                
            
            return stack.empty();
    

    private static void test1() 

    

    private static void test2() 

    

    private static void test3() 

    

代码链接

剑指Offer代码-Java

以上是关于Offer[31] 栈的压入弹出序列的主要内容,如果未能解决你的问题,请参考以下文章

Offer[31] 栈的压入弹出序列

剑指offer--31栈的压入弹出序列

剑指offer--31栈的压入弹出序列

算法剑指 Offer 31. 栈的压入弹出序列 重刷

[LeetCode]剑指 Offer 31. 栈的压入弹出序列

[LeetCode]剑指 Offer 31. 栈的压入弹出序列