關於給定入棧順序,求所有可能的出棧順序的討論
阿新 • • 發佈:2019-01-09
最近學習資料結構,關於給定入棧順序,求所有可能的出棧順序的問題有些迷惑(現在也是),於是搜尋了一些相關的材料。我覺得可能是因為目前我沒有理解問題而無法得出答案。詳情見下。
先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到
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;
}
該文章多為摘抄,僅為個人學習所用,侵刪,感謝!