窮舉所有可能的出棧序列

2021-09-25 03:22:09 字數 1275 閱讀 4308

輸入乙個入棧序列,輸出可能的出棧序列。

輸入格式

第一行輸入乙個整數 n ,表示入棧序列的長度。

第二行輸入 n 個數字,表示入棧序列。

輸出格式

輸出所有可能的出棧序列

輸入樣例

3

1 2 3

輸出樣例

1 2 3

1 3 2

2 1 3

2 3 1

3 2 1

很容易看出來,本題目是一道遞迴題。可以通過窮舉遍歷得到結果,因為對於任意乙個棧狀態,我們有兩種選擇,一種是向棧中新增元素,另外一種是從棧中取出元素。

首先是需要哪些變數儲存資訊。

需要乙個變數 n 儲存入棧序列個數。

需要乙個陣列 data 儲存入棧序列。

需要乙個變數 index 儲存當前需要入棧的元素下標。

需要乙個棧 input 模擬入棧出棧操作。

需要乙個棧 output 儲存出棧結果。

使用區域性變數(狀態通過函式引數體現)解決比較簡單。

這裡我使用全域性變數進行解決,重點在於進行遞迴完後,需要恢復狀態。

在遞迴函式中,如果index == n表明,入棧操作已經全部完成,此時對應的出棧結果已經確定,將 input 中的元素依次放入 output 中,然後從棧底依次輸出元素,即為出棧結果。

如果 index != n,表明還有元素需要入棧,那麼此時操作有兩種,一種是先出棧乙個元素,或者先入棧乙個元素,然後依次遞迴下去。

stackinput,output;

int n;

void dfs(int index,int* data)

// 為實現輸出結果,需要先將output棧中元素輸入到乙個棧中,然後從該棧中輸出,這樣可以實現從棧底到棧頂的遍歷

// 為減少空間代價,這裡選擇的這個棧為input

while(outtmp.size())

while(intmp.size())

cout << endl;

return ;

}// 棧不為空,先選擇出棧

if(input.size())

//然後選擇入棧

input.push(data[index]);

dfs(index + 1,data);

input.pop();

}

可能的出棧序列問題

首先的前提是進棧一定是要按照順序進棧如1 2 3 4的順序,如果第乙個出的是4,那麼要依次先進棧1 2 3 4,然後出棧,這樣的話第乙個是4,沒有其他的元素可以再進棧了,所以只能按順序出棧,這樣出棧的順序就是4 3 2 1。假如出棧的順序是3 4 2 1,你就要先分析出3的情況,只有先將1 2 3入...

輸出所有可能的出棧順序

構造棧類結構體 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...