1. 程式人生 > 其它 >洛谷 || 棧(C語言)

洛谷 || 棧(C語言)

技術標籤:C語言刷題c語言卡特蘭數

題目背景
棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。

棧有兩種最重要的操作,即 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; }

執行結果:
在這裡插入圖片描述