給定入棧順序,輸出所有可能出棧情況及所有情況的總數

2021-08-31 03:53:45 字數 2783 閱讀 5195

乙個長度為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 返...