洛谷 || 棧(C語言)
阿新 • • 發佈:2020-12-13
題目背景
棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。
棧有兩種最重要的操作,即 pop(從棧頂彈出一個元素)和 push(將一個元素進棧)。
棧的重要性不言自明,任何一門資料結構的課程都會介紹棧。寧寧同學在複習棧的基本概念時,想到了一個書上沒有講過的問題,而他自己無法給出答案,所以需要你的幫忙。
題目描述
寧寧考慮的是這樣一個問題:一個運算元序列1,2,…,n(圖示為 1 到 3 的情況),棧 A 的深度大於n。
現在可以進行兩種操作,
將一個數,從運算元序列的頭端移到棧的頭端(對應資料結構棧的 push 操作)
將一個數,從棧的頭端移到輸出序列的尾端(對應資料結構棧的 pop 操作)
使用這兩種操作,由一個運算元序列就可以得到一系列的輸出序列,下圖所示為由 1 2 3 生成序列 2 3 1 的過程。
(原始狀態如上圖所示)
你的程式將對給定的 n,計算並輸出由運算元序列 1,2,…,n 經過操作可能得到的輸出序列的總數。
輸入格式
輸入檔案只含一個整數 n(1≤n≤18)。
輸出格式
輸出檔案只有一行,即可能輸出序列的總數目。
輸入輸出樣例
輸入
3
輸出
5
卡特蘭數又稱卡塔蘭數,卡特蘭數是組合數學中一種常出現於各種計數問題中的數列。
原始碼:
#include<stdio.h>
int n,d[30];
int main(){
int i,j;
scanf("%d",&n);
d[0]=1;
d[1]=1;
for(i=2;i<=n;i++)
for(j=0;j<i;j++)
d[i]+=d[j]*d[i-j-1];//遞迴實現卡特蘭數
printf("%d",d[n]);
return 0;
}
執行結果: