假设栈的输入序列为1、2、3、...、n,求出所有可能的出栈序列

假设栈的输入序列为1、2、3、...、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);
        }
    }
}

 

?
  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
这是一个经典的的应用问题,可以使用递归的思路来解决。 假设当前中的元素为1,2,3,...,i,已经有一个出栈序列为seq,现在需要判断是否能将中的元素全部出栈,且出栈顺序为seq。 1. 如果已经为空,说明出栈序列是合法的,输出seq; 2. 如果不为空,分两种情况考虑:将顶元素出栈,或者将顶元素留在中。如果将顶元素出栈,则当前的出栈序列为seq + 顶元素,中的元素变为1,2,3,...,i-1;如果将顶元素留在中,则当前的出栈序列为seq,中的元素变为1,2,3,...,i-1,i。然后递归处理中的元素,直到为空为止。 具体实现可以参考下面的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 void dfs(int n, int index, int *stack, int top, int *visited, int *seq) { if (top < 0) { // 已经为空,输出出栈序列 for (int i = 0; i < n; i++) { printf("%d ", seq[i]); } printf("\n"); return; } // 将顶元素出栈 if (top >= 0) { seq[index] = stack[top]; visited[stack[top]] = 1; dfs(n, index + 1, stack, top - 1, visited, seq); visited[stack[top]] = 0; } // 将顶元素留在中 if (top >= 0) { int x = stack[top]; for (int i = x - 1; i >= 1; i--) { if (!visited[i]) { stack[top + 1] = i; dfs(n, index, stack, top + 1, visited, seq); } } } } int main() { int n; printf("请输入 n:"); scanf("%d", &n); int stack[MAX_SIZE]; int visited[MAX_SIZE]; int seq[MAX_SIZE]; // 初始化和 visited 数组 for (int i = 0; i < n; i++) { stack[i] = i + 1; visited[i + 1] = 0; } dfs(n, 0, stack, n - 1, visited, seq); return 0; } ``` 输入n=3时,输出结果为: ``` 3 2 1 3 1 2 2 3 1 2 1 3 1 3 2 1 2 3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值