栈的顺序输入,多种输出计算实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44116998/article/details/101631863

题目描述
若栈的输入序列为 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--;//回溯 
}

运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/101631863