棧的出隊順序問題:
(一)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...