Catlan數之棧的出棧序列 legend

2021-06-25 11:10:32 字數 1883 閱讀 7301



棧的出隊順序問題:

(一)catlan數:

(1)給出入棧序列,求出所有的出棧的序列個數:

c(2n,n)/(n+1);

(2)給出入棧序列,求出所有的出棧序列;

1)舉例:

1、2、3這三個數字,入棧並出棧共有5種方式,分別為:321、312、231、213、123。

2)分析:

1.可以用佇列(queue)來模擬輸入,佇列的輸出則按照原先序列的順序。使用乙個棧(stack)來模擬入棧和出棧,結果儲存在另外乙個佇列(queue)中。

2.怎麼樣可以實現所有的出棧入棧操作。首先來看看出棧和入棧是怎麼回事,對於123這個序列,1先入棧之後有兩種選擇,1出棧和2入棧,而若2已經入棧之後,在2出棧之前1則不能先行出棧,故對於1我們只需要考慮其在2入棧之前出棧的情況,若1在棧內時2入棧,則1與2只能看成乙個整體。

3。偽**:

dostack(輸入佇列,中間棧,輸出佇列)

if(輸入隊列為空)

if(中間棧為空)

輸出輸出佇列中的結果

else

中間棧出棧,放入輸出佇列

dostack(輸入佇列,中間棧,輸出佇列)

else

if(中間棧非空)

新建輸入佇列2、中間棧2、輸出佇列2

中間棧2出棧並放入輸出佇列2

dostack(輸入佇列2,中間棧2,輸出佇列2)

輸入佇列出隊乙個數並壓入中間棧

dostack(輸入佇列,中間棧,輸出佇列)

2)思想:

對於中間棧的每乙個時刻拍照,都遞迴其後續的所有可能,由於在遞迴返回的時候還需要遞迴前的資訊,所以每次遞迴都是新建資料結構而儲存當前時刻的狀態。若輸入佇列已經為空,則中間棧只有一種出棧方式,中間棧也為空時遞迴結束。

3)**實現:

/*輸入為序列的長度n,初始化序列為1,2,3…n,而輸出則為所有可能的出棧數列。

*/#include

#include

#include

using namespace std;

int n,i,j;

int res;//統計出隊序列的個數

stack s;

queue in,out;//輸入佇列,輸出佇列

/*將棧中所有元素出棧*/

void clear(stack &s)

/*將佇列中所有元素出隊*/

void clear(queue &s)

/*輸出佇列中所有的元素*/

void print(queue i)

else

}else

s.push(in.front());//取輸入佇列的下乙個元素到中間棧中。

in.pop();

dostack(in,s,out);}}

/*測試函式*/

int main()

;//入棧序列

int arr2 = ;

stackstk;

int j = 0;

for(int i = 0;i < 5;i++)else break;}}

if(stk.size()!=0)

else cout << " yes " << endl;

return 0;

}方法二:利用結論

在a之前進棧的元素,出現在出隊序列的a之後,則這些元素必定逆序。

------

(二)出隊順序問題:

(1)結論:

在a之前進棧的元素,出現在出隊序列的a之後,則這些元素必定逆序。

(2)舉例:

如:a,b,c,d,e ,5個元素依次入棧,則如果d先出隊,則出隊序列可以為:

d,c,b,a的序列已定,e的位置任意。

(三)括號匹配+catlan數:



棧(出棧序列)

已知自然數1,2,n 1 n 10000 依次入棧 即a1 c2,cn 是否為可能的出棧序列。例如 n 5時,3,4,2,1,5是乙個可能的出棧序列,因為其可以按如下操作獲得 push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop input 輸...

棧 出棧序列判定

給乙個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入乙個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個出棧序列,但4,3,5,1,2就...

由入棧 出棧序列求所有出棧 入棧序列

給出乙個陣列,代表入棧順序,求所有出棧可能性?給出乙個陣列,代表出棧順序,求所有入棧可能性?這兩題解法相同,可利用全排列求出所有組合,再進行可能性分析。全排列 如下 public list permute int nums 這種方法是什麼意思呢?例如abc,在第0位有三種可能,axx,bxx,cxx...