卡塔兰数

出栈次序问题:

一个栈的进栈序列为1,2,3……n,有多少种不同的出栈序列?

#include <stack>
#include <vector>
#include <iostream>
using namespace std;
#define N 100

int len, num[2], arr[N];   // num[2]分别记录剩余的入栈出栈操作次数
stack<int> s;     // 根据v的记录用s模拟过程并输出
vector<int> v;    // 记录到目前已进行的操作

void init()
{
    cout << "input the length of sequence:" << endl;
    cin >> len;
    num[0] = len;
    num[1] = len;
    for(int i = 0; i < len; i++)
        arr[i] = i + 1;
}
void func()
{
    if(v.size() == 2*len)       // 输出找到的可行解
    {
        int cnt = 0;
        vector<int>::iterator it;
        for(it=v.begin(); it!=v.end(); it++)
        {
            if(*it == 0)
                s.push(arr[cnt++]);
            else
            {
                cout << s.top() << " ";
                s.pop();
            }
        }
        cout << endl;
    }
    if(num[0] > 0)           // 满足入栈条件
    {
        num[0]--;
        v.push_back(0);
        func();              // 递归
        v.pop_back();
        num[0]++;
    }
    if(num[0] < num[1])      // 满足出栈条件
    {
        num[1]--;
        v.push_back(1);
        func();              // 递归
        v.pop_back();
        num[1]++;
    }
}
int main()
{
    init();
    func();
    return 0;
}

 

posted on 2015-07-16 12:06  huashunli  阅读(199)  评论(0编辑  收藏  举报

导航