给定序列,求这个序列的出栈次序

比如1,2,3 的出栈次序可以是{1,2,3}{2,1,3}{2,3,1}{1,3,2}{3,2,1}5种。

其实这个 和leetcode生成括号那个题目很像。题目链接https://leetcode.com/problems/generate-parentheses/

题解

http://www.cnblogs.com/pk28/p/5355711.html

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"

代码中x表示左括号的数量,y表示右括号的数量。

class Solution {
public:
    void dfs(int n,string s,int x,int y,vector<string>&v){
        if(y==n){
            v.push_back(s);
            return ;
        }
        if(x<n)dfs(n,s+‘(‘,x+1,y,v);
        if(x>y)dfs(n,s+‘)‘,x,y+1,v);
    }
    vector<string> generateParenthesis(int n) {
        vector<string>v;
        string s="";
        dfs(n,s,0,0,v);
        return v;
    }
};

对于 出栈序列的问题,可以这么理解,对于1、2、3的序列,进栈可以用(表示  出栈可以用) 表示。

那么一个 出栈序列 3 2 1 可以表示为((( )))  、  出栈序列1 2 3 可以表示成()()()。不一一列举了...

把上面的代码 改一改就得到了 出栈序列的写法

/* ***********************************************
Author        :guanjun
Created Time  :2016/8/20 11:22:04
File Name     :a.cpp
************************************************ */
#include <bits/stdc++.h>
using namespace std;
vector<int>v;
vector<int>a;
vector<int>b;
int n,cnt;
void dfs(int x,int y){//进栈次数  出栈次数
    if(y==n){
        for(int i=0;i<b.size();i++)
            cout<<b[i]<<" ";
        for(int i=a.size()-1;i>=0;i--)
            cout<<a[i]<<" ";
        cout<<endl;
        cnt++;
        return ;
    }
    if(x<n){//进栈
        a.push_back(v[x]);
        dfs(x+1,y);
        a.pop_back();
    }
    if(x>y){
        b.push_back(a.back());
        a.pop_back();
        dfs(x,y+1);
        a.push_back(b[b.size()-1]);
        b.pop_back();
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        v.push_back(x);
    }
    cnt=0;
    dfs(0,0);
    cout<<"all kind "<<cnt<<endl;
    return 0;
}

关于出栈序列的总数..其实这是卡特兰数问题。

答案是C(2n,n)-C(2n,n-1);

时间: 2024-08-05 19:37:03

给定序列,求这个序列的出栈次序的相关文章

递归输出所有出栈次序及卡塔兰数应用

用ArrayList模拟栈的操作,采用递归算法.代码如下: 1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class stackAll { 5 static int num=0; 6 public static void main(String[] args) { 7 Scanner scanner=new Scanner(System.in); 8 int n=scanner.nextInt();//输

C语言 &#183; 出栈次序

标题:出栈次序 X星球特别讲究秩序,所有道路都是单行线.一个甲壳虫车队,共16辆车,按照编号先后发车, 夹在其它车流中,缓缓前行. 路边有个死胡同,只能容一辆车通过,是临时的检查站,如图[p1.png]所示. X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查. 如果车辆进入检查站和离开的次序可以任意交错.那么,该车队再次上路后,可能的次序有多少种? 为了方便起见,假设检查站可容纳任意数量的汽车. 显然,如果车队只有1辆车,可能次序1种:2辆车可能次序2种:3辆车可

数据结构学习——栈的出栈次序及次序种类

学过数据结构的程序猿应该都清楚,栈是一种先入后出,后入先出(LIFO)的表.即插入和删除都只能在一个位置上进行,即栈顶位置.对栈的基本操作有Push(入栈)和Pop(出栈).在一般软件研发的笔试中,就会经常遇到关于入栈次序一定时,出栈次序有哪些?共有几种? 其实,此处只要了解一下卡特兰数的算法结构,参见: http://baike.baidu.com/link?url=T7ZR16yiaWKNQPhem12nYJS56PqVeizOPnsGhBlynVFEy6JbB8CrMYKIetkvYm4Q

第五届蓝桥杯决赛C\C++B组——出栈次序

第一部分:题目 出栈次序 X星球特别讲究秩序,所有道路都是单行线.一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行. 路边有个死胡同,只能容一辆车通过,是临时的检查站. X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查. 如果车辆进入检查站和离开的次序可以任意交错.那么,该车队再次上路后,可能的次序有多少种? 为了方便起见,假设检查站可容纳任意数量的汽车. 显然,如果车队只有1辆车,可能次序1种:2辆车可能次序2种:3辆车可能次序5种. 现在

出栈次序--数学归纳法--蓝桥

出栈次序   X星球特别讲究秩序,所有道路都是单行线.一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行.    路边有个死胡同,只能容一辆车通过,是临时的检查站,如图[p1.png]所示.    X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查.    如果车辆进入检查站和离开的次序可以任意交错.那么,该车队再次上路后,可能的次序有多少种?    为了方便起见,假设检查站可容纳任意数量的汽车.    显然,如果车队只有1辆车,可能次序1种:2

给定入栈序列,求所有可能的出栈序列。

给定一个入栈的序列(1,2,3,4,5):求它所有可能的出栈序列. 思路:先求序列的全排列,再求全排列的同时,判断这个序列是不是出栈序列. package MaxMin; import java.util.ArrayList; import java.util.Arrays; import java.util.Stack; public class StackPopArray { static ArrayList<ArrayList<Integer>> lists=new Arra

给定一个序列,判断该序列是否是对应输入序列的出栈序列问题

最近在刷剑指offer的题目,有问题描述如下: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) 分析:从这样的角度来考虑,我们首先建立一个空栈,观察出栈序列,找到第一个出栈的元素所在的位置,找到之后,将这个元素以及该元素入栈顺序前的所有元素压栈

栈与队列问题1——出栈序列

问题描述:栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数. 分析:之前就有看过这种问题.就是火车进站问题,判断序列是否合法,当时是用STL栈做的.这个题只需统计次数,那么,方法就十分简便了,递归和动归都可以实现,当然

Catalan数 &amp;&amp; 【NOIP2003】出栈序列统计

令h(1)=1, h(0)=1,catalan数满足递归式: h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0) (n>=2) =C(2n, n)/(n+1) =h(n-1)*2(2n-1)/(n+1) 具体推导请百度,这里只需记得推导公式为h(n)=h(n-1)*2(2n-1)/(n+1)即可. 我们来说说这个的应用吧,从catalan数的定义递归定义可以看出,它是由自己 本身的一部分和n减去一部分 的和得到的,也就是说,有n个物品,1个物品进行操作1,n-