乙個長度為n的無重複序列入棧的所有出棧方式
例如1、2、3這三個數字,入棧並出棧共有5種方式,分別為:321、312、231、213、123。那麼對於長度為n的無重複序列中所有的出棧方式有哪些呢?
為了設計計算的演算法,我們可以用佇列(queue)來模擬輸入,佇列的輸出則按照原先序列的順序。使用乙個棧(stack)來模擬入棧和出棧,結果儲存在另外乙個佇列(queue)中。
現在的問題來了,怎麼樣可以實現所有的出棧入棧操作。首先來看看出棧和入棧是怎麼回事,對於123這個序列,1先入棧之後有兩種選擇,1出棧和2入棧,而若2已經入棧之後,在2出棧之前1則不能先行出棧,故對於1我們只需要考慮其在2入棧之前出棧的情況,若1在棧內時2入棧,則1與2只能看成乙個整體。
這樣就可以用遞迴的方式求解,偽**如下:
dostack(輸入佇列,中間棧,輸出佇列)
if(輸入隊列為空)
if(中間棧為空)
輸出輸出佇列中的結果
else
中間棧出棧,放入輸出佇列
dostack(輸入佇列,中間棧,輸出佇列)
else
if(中間棧非空)
新建輸入佇列2、中間棧2、輸出佇列2
中間棧2出棧並放入輸出佇列2
dostack(輸入佇列2,中間棧2,輸出佇列2)
輸入佇列出隊乙個數並壓入中間棧
dostack(輸入佇列,中間棧,輸出佇列)
其基本思想為對於中間棧的每乙個時刻拍照,都遞迴其後續的所有可能,由於在遞迴返回的時候還需要遞迴前的資訊,所以每次遞迴都是新建資料結構而儲存當前時刻的狀態。若輸入佇列已經為空,則中間棧只有一種出棧方式,中間棧也為空時遞迴結束。
詳細**如下:
輸入為序列的長度n,初始化序列為1,2,3…n,而輸出則為所有可能的出棧數列。
//輸入壓棧順序如1 2 3 4 5 6 7 8 ..n,確定所有可能出棧的得到的結果
//同時計算情況的總數n
#include
#include
#include
#include
using namespace std;
//遞迴法只計算所有情況總數
int getpermustack(int n, int m)
//catalan公式法 最多只能算到n=10
long long jiecheng(long long n)
long long catalan(long long n)
//下面演算法函式既輸出所有可能壓棧(不全壓,但仍按給定順序壓棧)的情況,也輸出對應的出棧情況及總數
int n,i,j;
int res;
stack s;
queue in,out;
void clear(stack &s)
void clear(queue &s)
void print(queue i)
cout<
}
void dostack(queue in,stack s,queue out)
else
}
else
s.push(in.front());
in.pop();
dostack(in,s,out);
}
}
int main()
cout<<"1~n依次進棧時,使用遞迴函式所有的情況總數:"<
for(i=1;i<15;i++)
cout<<"n="<
cout<
for(i=1;i<15;i++)
cout<<"n="<
return 0;
}
關於給定入棧順序,求所有可能的出棧順序的討論
最近學習資料結構,關於給定入棧順序,求所有可能的出棧順序的問題有些迷惑 現在也是 於是搜尋了一些相關的材料。我覺得可能是因為目前我沒有理解問題而無法得出答案。詳情見下。先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到 n 2n n n 1 該公式 c 2n,n n 1 c 2n,n 表示2n裡取...
輸出所有可能的出棧順序
構造棧類結構體 stack void initstack stack s,int n 初始化棧的結構 void copystack stack ss,stack s 複製函式 void outputstack stack s 輸出函式 intstackempty stack s 判斷棧是否為空 vo...
「根據入棧順序判斷可能的出棧順序」python語言
題目描述 輸入兩個整數序列,其中乙個序列表示棧的push 入 順序,判斷另乙個序列有沒有可能是對應的pop 出 順序。class stack 實現棧的功能 def init self self.items 判斷棧是否為空 def empty self return self.items none 返...