版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述
若栈的输入序列为 1234,给出所有可能的输出序列。
思路解答
一个数在栈的面前要么是入栈,要么是出栈,也就这两者可能选择。所以在实现的时候,我们选择出栈的那一步时,后面会跟着下一层递归,那么我们可以采用一个数组暂时储存作为出栈的记录,调用完函数后,再将该数返回主栈中,继续后续递归,大概就是这样实现了。
这个题很明显用回溯或者DFS都是是可以解决的,但是对于掌握递归不是很熟练的我来说,还是有一定的难度,所以先把理解实现写下来,其实之前采用DFS实现时,有点问题,没成功。
框图解析
递归过程:代码的每一步实现应该比较清楚了,包括递归层次,这里因为递归的深度以及广度比较大,就选取了 n = 2作为样例,太大了,作图不行,还更复杂。
代码实现
#include<iostream>
using namespace std;
void SearchFunction(int ,int *,int ,int *,int );
int main()
{
int n = 4;
int start[5] = {0},end[5] = {0};
//end数组存出栈的数,start数组操作数组
SearchFunction( 1 ,start,0,end,0);//递归函数
return 0;
}
void SearchFunction( int n ,int start[ ],int startnum, int end[ ],int endnum)
{
if(n == 5)//递归结束条件
{
int i;
for(i = 1;i <= endnum;i++)
cout<<end[i]<<' ';//先出栈的数
for( i = startnum;i > 0;i--)
cout<<start[i]<<' ';//剩下的数
cout<<endl;
return ;//递归结束,返回
}
if(startnum > 0)//不为空时,即不止一个元素时,若只有一个元素,不会进入该步
{
end[++endnum] = start[startnum];//栈顶元素复制给end数组
startnum--;//栈顶元素模拟出栈
SearchFunction(n,start,startnum,end,endnum);//下一个元素入栈
start[++startnum] = end[endnum];//传回
endnum--;//回溯
}
start[++startnum] = n;//元素入栈
SearchFunction(n + 1,start,startnum,end,endnum);//递归下一个数
startnum--;//回溯
}
运行结果