1. 程式人生 > >劍指offer: 棧的壓入和彈出序列

劍指offer: 棧的壓入和彈出序列

span boolean 結束 壓棧 輔助 == peek pty cnblogs

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(註意:這兩個序列的長度是相等的)

(1)如果下一個彈出的數字剛好是棧頂數字,那麽直接彈出;
(2)如果一下個彈出的數字不在棧頂,則把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下一個需要彈出的數字壓入棧頂;
(3)如果所有數字都壓入棧仍然沒有找到下一個彈出的數字,那麽該序列不可能是一個彈出序列

public boolean IsPopOrder(int
[] array,int [] test) { if(array==null || test==null || array.length != test.length) return false; Stack<Integer> stack = new Stack<>(); boolean flag = false; int indexArray=0, indexTest=0; while(indexTest < test.length){
while(indexArray < array.length){ if(!stack.empty() && stack.peek()==test[indexTest]) break; stack.push(array[indexArray++]); }
          
//預期棧頂元素應該與下一個要pop的元素相等,不相等則不符合,直接結束判斷
if(stack.peek() != test[indexTest]) break; stack.pop(); indexTest++; } if(stack.empty() && indexTest==test.length) flag = true; return flag; }

劍指offer: 棧的壓入和彈出序列