劍指offer: 棧的壓入和彈出序列
阿新 • • 發佈:2017-08-27
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: 棧的壓入和彈出序列