1. 程式人生 > 其它 >判斷棧的出棧順序合法性

判斷棧的出棧順序合法性

棧的出棧順序合法性是指給定一系列元素,如1 - N,按照從小到大的方式入棧,每個元素的出棧時機不定。題目給定一個出棧順序,我們來判斷這個出棧順序有沒有可能發生。

比如對[1,2,3,4,5,6,7,8,9]:

  • [1,2,3,4,5,6,7,8,9]是一個合法出棧序列
  • [9,8,7,6,5,4,3,2,1]也是一個合法序列
  • [4,5,3,2,7,6,1,8,9]也是一個合法序列
  • [3,4,5,1,2,9,8,7,6]就是一個非法序列

判斷方法有兩種,一種是對每一個值,其後所有小於它的值的數是一個降序排列。

另一種是模擬入棧和出棧,對出棧序列中每一個數值,如果它當前已經在棧頂,則出棧;如果不在,那麼從入棧序列中取出下一個放入棧中;如果需要入棧時入棧序列已空,則這就是一個非法序列。


程式碼如下:

    public static boolean stackOrder(int[] nums){
        int[] origin=new int[]{1,2,3,4,5,6,7,8,9};
        //假定出棧序列也是1-9的數列
        Deque<Integer> q=new ArrayDeque<>();
        int index=0,i=0;
        for (i=0;i<nums.length;){
            if(!q.isEmpty()&& nums[i]==q.getLast()){
                q.pollLast();
                i++;
            }
            else {
                if(index<9) {
                    q.addLast(origin[index++]);
                }
                else break;
            }
        }
        return i==nums.length?true:false;
    }