最近學習資料結構,關於給定入棧順序,求所有可能的出棧順序的問題有些迷惑(現在也是),於是搜尋了一些相關的材料。我覺得可能是因為目前我沒有理解問題而無法得出答案。詳情見下。
先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到
n = (2n!)/(n! * (n+1)!)
該公式:
c(2n,n)/(n+1) (c(2n,n)表示2n裡取n),名字叫catalan數。附上wiki的鏈結,寫得很詳細:
附上大牛的思路「
折現法」。
最後附上一道題目及原始碼。
//例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。
//借助乙個佇列和乙個棧結構
public boolean ispoporder(int pusha,int popa)
for(int i=0;iqueue.add(pusha[i]);
}for(int i=0;iint ele = popa[i];
if(!seq.isempty() && seq.peek()==ele)else
if(queue.isempty())
queue.poll(); //將ele元素出佇列,因為要從棧中彈出,就不入棧了}}
return
true;
}
該文章多為摘抄,僅為個人學習所用,侵刪,感謝! 給定入棧順序,輸出所有可能出棧情況及所有情況的總數
乙個長度為n的無重複序列入棧的所有出棧方式 例如1 2 3這三個數字,入棧並出棧共有5種方式,分別為 321 312 231 213 123。那麼對於長度為n的無重複序列中所有的出棧方式有哪些呢?為了設計計算的演算法,我們可以用佇列 queue 來模擬輸入,佇列的輸出則按照原先序列的順序。使用乙個棧...
輸出所有可能的出棧順序
構造棧類結構體 stack void initstack stack s,int n 初始化棧的結構 void copystack stack ss,stack s 複製函式 void outputstack stack s 輸出函式 intstackempty stack s 判斷棧是否為空 vo...
由入棧 出棧序列求所有出棧 入棧序列
給出乙個陣列,代表入棧順序,求所有出棧可能性?給出乙個陣列,代表出棧順序,求所有入棧可能性?這兩題解法相同,可利用全排列求出所有組合,再進行可能性分析。全排列 如下 public list permute int nums 這種方法是什麼意思呢?例如abc,在第0位有三種可能,axx,bxx,cxx...