N个数进栈的出栈顺序全排列及排列种数

     具体思路就是先列出1~N的全排列,然后再模拟入栈、出栈的过程筛选满足条件的排列。    

//Made by Xu Lizi
//2013/10/24


#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>


using namespace std;


int a[1000];
long long num = 0;
bool test_stack (int n);


void print(int l, int r, int n) {  
if (l == r) { 
if (test_stack(n)) {
for(int i = 0; i < n; i++) {         //输出满足条件的排列 
printf("%d" , a[i]);
}
printf("\n");
num++;
}
        return;  
    }   
              
        //1~N个数的全排列
        //来源自http://blog.csdn.net/pay_smile_yy/article/details/8250869
        else {     
        for(int i = l; i < r; i++) {  
            swap (a[i], a[l]);
            print (l + 1, r, n);
            swap (a[i], a[l]);
        }  
    }  
};


bool test_stack (int n)                     //通过模拟入栈、出栈的过程来判断满足条件 
{
stack <int> s;
int test = 1, i;


for (i = 0; i < n;) {
if (test > n)
return false;
if (test != a[i]) {
s.push(test);
test++;
} else {
test++;
i++;
while (!s.empty() && s.top() == a[i]) {
s.pop();
i++;
}
}
}
return true;
};


int main ()
{
int N;


cin >> N;
for (int i = 0; i < N; i++) {
a[i] = i+1;
}
print(0, N, N);
printf("%lld\n", num);
return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值