適用場景
- 最大深度可預估且固定(如表達式求值、遞歸轉迭代、DFS 手動棧)。
- 嵌入式環境禁用動態分配,追求確定性、零碎片。
- 教學演示棧邏輯,屏蔽記憶體管理細節。
數據結構定義
#define STACK_CAPACITY 50
typedef struct {
int data[STACK_CAPACITY];
int top; // 棧頂索引,-1 表示空
} StaticStack;
核心操作
void Stack_Init(StaticStack *s) { s->top = -1; }
bool Stack_IsEmpty(const StaticStack *s) { return s->top == -1; }
bool Stack_IsFull(const StaticStack *s) { return s->top == STACK_CAPACITY - 1; }
bool Stack_Push(StaticStack *s, int val) {
if (Stack_IsFull(s)) return false;
s->data[++s->top] = val;
return true;
}
bool Stack_Pop(StaticStack *s, int *out) {
if (Stack_IsEmpty(s)) return false;
*out = s->data[s->top--];
return true;
}
bool Stack_Top(const StaticStack *s, int *out) {
if (Stack_IsEmpty(s)) return false;
*out = s->data[s->top];
return true;
}
void Stack_Print(const StaticStack *s) {
if (Stack_IsEmpty(s)) { puts("empty"); return; }
for (int i = s->top; i >= 0; --i) printf("%d ", s->data[i]);
puts("");
}
測試主程式
int main(void) {
StaticStack s; Stack_Init(&s);
Stack_Push(&s, 4); Stack_Push(&s, 6); Stack_Push(&s, 1);
Stack_Push(&s, 9); Stack_Push(&s, 2); Stack_Push(&s, 8);
Stack_Print(&s); // 8 2 9 1 6 4
int v;
Stack_Pop(&s, &v); Stack_Pop(&s, &v); Stack_Pop(&s, &v); Stack_Pop(&s, &v);
Stack_Print(&s); // 6 4
Stack_Top(&s, &v); printf("top=%d\n", v); // 6
return 0;
}
優缺點總結
| 優點 | 缺點 |
| 零動態分配,無碎片、無洩漏 | 容量固定,溢出需自行處理 |
| 極快(連續內存,緩存友好) | 無法適應運行時未知深度 |
| 代碼極簡,適合教學/嵌入式 | 佔用棧空間(若作局部變數) |
擴展建議
- 改用
void* 支援泛型元素(需外部管理元素生命週期)。
- 加入
capacity 字段,配合 realloc 實現動態擴容(變為動態數組棧)。
- 多線程環境添加自旋鎖或互斥鎖。