天天看點

劍指offer22,棧的壓入、彈出序列(Java實作)

import java.util.Stack;

public class test22 {

    public boolean IsPopOrder(int [] pushA,int [] popA) {

        boolean flag = false;

        //都是一個元素的時候直接判斷

        if(pushA.length == 1 && popA.length == 1 && popA[0] == pushA[0]){  

            return true;

        }

        if(pushA.length == 1 && popA.length == 1 && popA[0] != pushA[0]){

            return false;

        }

        if(popA != null && pushA != null){       //兩個序列都為空,直接傳回

            Stack<Integer> stack = new Stack<>();

            int i = 0;  //push的指針

            int j = 0; //pop的指針

            //檢查每個出棧

            while(j < popA.length){

                //push中的數是否村入棧

                while(i < pushA.length && pushA[i] != popA[j]){

                    stack.push(pushA[i]);

                    i++;

                }

                //相等的元素直接就過去了

                ++i;

                ++j;

                //定義接下來要出棧元素

                int top = 0;

                //如果要出棧的元素和pop相等,就一直出

                while(!stack.isEmpty() && (top = stack.pop()) == popA[j]){

                    ++j;

                }

                //如果不等了,還放回去

                if(j < popA.length){

                    stack.push(top);

                }

                //當找不到合适出棧元素時,push已經放完了,stack因為不相等也彈不出來,就結束

                if(i >= pushA.length && !stack.isEmpty()){

                    break;

                }

            }

            if(stack.isEmpty()){

                flag = true;

            }

        }

        return flag;

    }

}