1. 程式人生 > >給定入棧順序,求所有可能的出棧順序

給定入棧順序,求所有可能的出棧順序

先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到

n = (2n!)/(n! * (n+1)!)

那麼怎麼樣得到所有的具體出棧順序呢,有兩種思路可以解決這個問題。

1.先得到入棧字串的全排列,然後根據出棧順序的規律進行篩選。

那麼篩選的條件是什麼?

舉例說明

入棧順序:1 2 3 4 5
出棧順序:3 2 1 5 4

出棧的每個元素後面比該元素小的元素,應該按從大到小的相對順序排列

由於入棧不一定按照從小到大的順序,可以推出:

出棧的每個元素後面比該元素的原下標小的元素,應該按原下標從大到小的相對順序排列

原理:
最理想的情況下,從小到大入棧,從大到小出棧,但是因為出棧是隨機的,也就是在入棧還沒結束的情況下就可以出棧。這樣,就會出現一些小的數提前出棧的現象。但是那些“守規矩”的小數相對位置是沒有變化的。比如入棧12345,結果在4入棧之前3不聽話先出去了。但是這不會影響12的順序,12的相對順序還是保持著 12入棧,21出棧。因為12是守規矩的。
下面給出程式碼,程式碼是建立在從小到大入棧的情況下的

include

include

include

using namespace std;
int flag;
void perm(char a[], int l, int r)
{
int x,y,z;
if(l == r)
{
flag = 1;
for(x=0;x