判斷棧的出棧順序合法性
阿新 • • 發佈:2022-05-04
棧的出棧順序合法性是指給定一系列元素,如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; }