1. 程式人生 > >關於給定入棧順序,求所有可能的出棧順序的討論

關於給定入棧順序,求所有可能的出棧順序的討論

最近學習資料結構,關於給定入棧順序,求所有可能的出棧順序的問題有些迷惑(現在也是),於是搜尋了一些相關的材料。我覺得可能是因為目前我沒有理解問題而無法得出答案。詳情見下。

先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到

n = (2n!)/(n! * (n+1)!)

公式:C(2n,n)/(n+1) (C(2n,n)表示2n裡取n),名字叫

最後附上一道題目及原始碼。

題目描述

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

思路:先將入棧序列放入佇列queue中。為入棧序列維護棧結構stack。對出棧序列進行如下操作:

如果棧頂是出棧元素,出棧。 
如果棧頂不是出棧元素,在佇列中查找出棧元素,並將出棧元素之前的元素出佇列,並且壓入stack中,如果在佇列中沒找到對應元素,則為非法序列。

程式碼如下:

    //例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。
    //藉助一個佇列和一個棧結構
    public boolean IsPopOrder(int [] pushA,int [] popA) {

        Stack<Integer> seq = new
Stack<Integer>(); Queue<Integer> queue = new LinkedList<Integer>(); if(pushA.length==0 || popA.length==0){ return false; } for(int i=0;i<pushA.length;i++){ queue.add(pushA[i]); } for(int i=0;i<popA.length;i++){ int
ele = popA[i]; if(!seq.isEmpty() && seq.peek()==ele){ //棧頂元素等於出棧元素,出棧 seq.pop(); }else{ //棧頂元素不是出棧元素,在佇列中查詢元素,並將這個元素之前的元素進棧,如果沒找到對應的元素,則為非法序列 while(!queue.isEmpty() && queue.peek()!=ele){ seq.add(queue.poll()); } if(queue.isEmpty()){ //佇列已經空了,還沒找到對應的元素,非法序列 return false; } queue.poll(); //將ele元素出佇列,因為要從棧中彈出,就不入棧了 } } return true; }

 該文章多為摘抄,僅為個人學習所用,侵刪,感謝!