輸入乙個入棧序列,輸出可能的出棧序列。
輸入格式
第一行輸入乙個整數 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...