栈的压入、弹出序列

文章目录


题目内容

尝试一

结果:case通过率为0.00%
code:

import java.util.ArrayList;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
      /*特殊情况处理*/
      if(pushA.length!=popA.length || pushA.length==0 || popA.length==0){
          return false;
      }
      int length=pushA.length;
      for(int i=0;i<length;++i){
          if(pushA[length-i-1]!=popA[i]){
              return false;
          }
      }
      return true;
    }
}

test case:

不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%

用例:
[1,2,3,4,5],[4,5,3,2,1]

对应输出应该为:

true

你的输出为:

false

分析:我以为是一直压,然后在一直弹。没想到可以压到一半的时候,就可以弹,然后在继续压。

尝试二

结果:答案正确:恭喜!您提交的程序通过了所有的测试用例
code:

import java.util.ArrayList;

public class Solution {
    private boolean find=false;

    public boolean IsPopOrder(int [] pushA,int [] popA) {
        /*特殊情况处理*/
        if(pushA.length!=popA.length || pushA.length==0 || popA.length==0){
            return false;
        }

        ArrayList<Integer> stack=new ArrayList<>();
        ArrayList<Integer> popRecord=new ArrayList<>();
        find(0,pushA,popA,true,(ArrayList<Integer>)stack.clone(),(ArrayList<Integer>)popRecord.clone());
        return find;
    }
    /*
     * i:当前处理的元素
     * pushA:压入的元素
     * popA:目标弹出序列
     * op:弹/压,压为true,弹为false
     * stack:当前弹出序列
     * popRecord:记录弹出序列
     */
    private void find(int i,int[] pushA,int[] popA,boolean isIn,ArrayList<Integer> stack,ArrayList<Integer> popRecord){
        if(isIn==true){
            /*递归结束标识*/
            if(i>=pushA.length){
                return ;
            }
            stack.add(pushA[i]);
        }

        if(isIn==false){
            if(stack.size()<=0){
                orderEq(popA,popRecord.toArray());
                return;
            }
            popRecord.add(stack.get(stack.size()-1));
            stack.remove(stack.size()-1);
        }




        //压
        find(i+1,pushA,popA,true,(ArrayList<Integer>) stack.clone(),(ArrayList<Integer>) popRecord.clone());
        //弹
        find(i,pushA,popA,false,(ArrayList<Integer>) stack.clone(),(ArrayList<Integer>) popRecord.clone());

    }


    /*比较两个数组序列是否相等*/
    private void orderEq(int [] a,Object []b){
        if(a.length!=b.length){
            return ;
        }else{
            int length=a.length;
            for(int i=0;i<length;++i){
                Integer t= (Integer) b[i];
                if(a[i]!=t){
                    return ;
                }
            }
            find= true;
        }
    }
}

思路:用递归试探的思路。栈的压入、弹出序列

结论

  • Arrays.asList()
  • 递归传入参数时,注意参数为引用类型时,递归函数中要改变参数的值。
  • 递归是有些参数,返回值根本不变。不如直接把他们存为实例变量。这样便于使用且避免代码复杂。
  • 想要拷贝一个对象,可以调用它的clone方法(注意可能需要强制类型转换)