穷举所有可能的出栈序列

题目描述

输入一个入栈序列,输出可能的出栈序列。
输入格式
第一行输入一个整数 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,表明还有元素需要入栈,那么此时操作有两种,一种是先出栈一个元素,或者先入栈一个元素,然后依次递归下去。

stack<int> input,output;
int N;

void dfs(int index,int* data)
{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值