給定一個序列宽闲,求所有的出棧順序

數(shù)據(jù)結構與算法


數(shù)學上的遞推公式

可以推到得出悲雳,過程較為復雜,此處略過
![][1]
[1]: http://latex.codecogs.com/gif.latex?S_n=\sum_{i=0}^{n-1}S_i*S_{n-1-i}

參看:
<a >卡特蘭數(shù)</a>
以下代碼給出了遞推關系:

int countS(int n) {
    if (n == 0) {
        return 1;
    }
    if (n == 1) {
        return 1;
    }
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += countS(i)*countS(n-1-i);
    }
    return sum;
}
```
## 模擬算法
棧每次有兩種情況:入棧和出棧陈哑,但是,不是每種組合都是合法的伸眶。合法的出棧入棧必須滿足以下條件(1表示入棧惊窖,0表示出棧):
1. 最終出棧和入棧的次數(shù)一樣,也就是0和1的數(shù)量都等于元素的個數(shù)
2. 棧為空時不能有出棧動作厘贼,也就是在任意時刻界酒,已經(jīng)出現(xiàn)的1必須大于等于0出現(xiàn)的次數(shù)
例如:
111000(合法)
110001(不合法)
模擬生成合法序列的 C++ 代碼如下:

```
#include <iostream>
using namespace std;
int m,a[20] = {1}, count0,count1;
void binSeq(int n) {
//邊界條件,輸出合法的序列嘴秸,其中 m 為一半的數(shù)組長度毁欣。
    if (2*m == n) {
        for (int i = 0; i < 2*m ; i++) {
            cout << a[i];
        }
        cout << endl;
        return;
    }
    //條件判斷庇谆,任意時刻1的個數(shù)小于 m 且大于0的個數(shù)
    if (count1 < m && count1 > count0) {
        a[n] = 1;
        count1++;
        binSeq(n+1);
        count1--;
        a[n] = 0;
        count0 ++;
        binSeq(n+1);
        count0 --;
    }
    //當不能所有的元素均已進行過入棧動作
    else if (count1 == m) {
        a[n] = 0;
        count0++;
        binSeq(n+1);
        count0--;
    }
    //當1和0數(shù)量相等即棧為空時,應入棧
    else if (count0 == count1) {
        a[n] = 1;
        count1++;
        binSeq(n+1);
        count1--;
    }
}
int main() {
    cin >> m;//輸入元素個數(shù)
    count0 = 0;
    count1 = 1;//首先必須入棧
    binSeq(1);
    return 0;
}

```
最后的代碼如下所示:
```
#include <iostream>
#include <vector>
#include <stack>
using namespace std;

int Size, PopCount, PushCount;//定義變量
vector < int >operation; // we can use 1 to stand for "push", and 0 for "pop"
stack < int >simulation;
//計算 n 個元素出棧順序的個數(shù)
int countS(int n) {
    if (n == 0) {
        return 1;
    }
    if (n == 1) {
        return 1;
    }
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += countS(i)*countS(n-1-i);
    }
    return sum;
}
//主要函數(shù)凭疮,原理與上面的簡化班函數(shù)相同饭耳,不再寫詳細注釋
void binSeq(int n, int *arr)
{
    if (2 * Size == n) {
    vector < int >::iterator Iter;
    int j = 0;
    for (Iter = operation.begin(); Iter != operation.end(); Iter++) {
        if (1 == (*Iter)) {
        simulation.push(arr[j]);
        j++;
        } else {
        cout << simulation.top() << " ";
        simulation.pop();
        }
    }
    cout << endl;
    return;
    }

    if (PushCount < Size && PushCount > PopCount) {
        operation.push_back(1);
        PushCount++;
        binSeq(n + 1, arr);
        operation.pop_back();
        PushCount--;
        operation.push_back(0);
        PopCount++;
        binSeq(n + 1, arr);
        operation.pop_back();
        PopCount--;
    }
    else if (PushCount == Size) {
        operation.push_back(0);
        PopCount++;
        binSeq(n + 1, arr);
        operation.pop_back();
        PopCount--;
    }
    else if (PopCount == PushCount) {
        operation.push_back(1);
        PushCount++;
        binSeq(n + 1, arr);
        operation.pop_back();
        PushCount--;
    }
}

int main()
{
    cout << "Please input the size of sequence:";
    operation.push_back(1);
    cin >> Size;
    cout << "Please input the size of sequence<int>:\n";
    int seq[Size];
    for (int i = 0; i < Size; i++) {
        cin >> seq[i];
    }
    cout << "The anwser is:\n";
    PopCount = 0;
    PushCount = 1;
    binSeq(1, seq);

    cout << "The number of all cases is : " << countS(Size) << endl;
    return 0;
}
```

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市执解,隨后出現(xiàn)的幾起案子寞肖,更是在濱河造成了極大的恐慌,老刑警劉巖衰腌,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件新蟆,死亡現(xiàn)場離奇詭異,居然都是意外死亡桶唐,警方通過查閱死者的電腦和手機栅葡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尤泽,“玉大人欣簇,你說我怎么就攤上這事∨髟迹” “怎么了熊咽?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闹丐。 經(jīng)常有香客問我横殴,道長,這世上最難降的妖魔是什么卿拴? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任衫仑,我火速辦了婚禮,結果婚禮上堕花,老公的妹妹穿的比我還像新娘文狱。我一直安慰自己,他們只是感情好缘挽,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布瞄崇。 她就那樣靜靜地躺著,像睡著了一般壕曼。 火紅的嫁衣襯著肌膚如雪苏研。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天腮郊,我揣著相機與錄音摹蘑,去河邊找鬼。 笑死轧飞,一個胖子當著我的面吹牛纹蝴,可吹牛的內(nèi)容都是我干的庄萎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼塘安,長吁一口氣:“原來是場噩夢啊……” “哼糠涛!你這毒婦竟也來了?” 一聲冷哼從身側響起兼犯,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤忍捡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后切黔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砸脊,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年纬霞,在試婚紗的時候發(fā)現(xiàn)自己被綠了凌埂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡诗芜,死狀恐怖瞳抓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伏恐,我是刑警寧澤孩哑,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站翠桦,受9級特大地震影響横蜒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜销凑,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一丛晌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斗幼,春花似錦茵乱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽督勺。三九已至渠羞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間智哀,已是汗流浹背次询。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓷叫,地道東北人屯吊。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓送巡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盒卸。 傳聞我的和親對象是個殘疾皇子骗爆,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容