假设栈的输入序列为1、2、3、...、n,设计算法求出所有可能的出栈序列(合法序列)。
比如 n = 4,出栈序列可能有1 2 3 4 , 1 2 4 3 , 1 4 3 2 , 1 3 4 2等等
我使用递归来完成,主要思想:从1到n输入,每一个数只对应两个操作,一个是入栈,一个是出栈(输出),我用一个栈保存入栈元素,一个数组保存出栈元素(这里也可以使用栈,但是输出元素时,需要从反向输出)。
比如 n = 4,出栈序列可能有1 2 3 4 , 1 2 4 3 , 1 4 3 2 , 1 3 4 2等等
我使用递归来完成,主要思想:从1到n输入,每一个数只对应两个操作,一个是入栈,一个是出栈(输出),我用一个栈保存入栈元素,一个数组保存出栈元素(这里也可以使用栈,但是输出元素时,需要从反向输出)。
void print_valid_sequence(int i,const int n )
{
static int number = 0;//记录序列的个数
static Stack<int> stack;//保存入栈的元素
static int array[10];//保存输出的元素
int top;//用来取top
if(i == n+1)//递归结束条件,输出序列
{
++number;
cout << number << "---";
for(int j = 0;j < n-stack.length();++j)
cout << array[j];//正序输出
stack.print();//输出
cout << endl;
}
else
{
stack.push(i);//入栈
print_valid_sequence(i+1,n);
stack.pop();//为保持stack不变,出栈
if(!stack.empty())//将栈顶元素输出
{
stack.getTop(top);
array[i-stack.length()-1] = top;//将输出的元素放入array中
stack.pop();
print_valid_sequence(i,n);//i不变
stack.push(top);
}
}
}