棧是後進先出(LIFO)的線性表,順序棧以數組為底層存儲,具有 O(1) 入棧出棧、緩存友好等優勢。本文提供一個生產級的順序棧 C 實現,包含頭文件聲明、完整操作函數、主程序測試,並解析關鍵設計決策。
stack.h#ifndef STACK_H
#define STACK_H
#define MAX 100
#define OK 1
#define ERROR 0
typedef struct {
int data[MAX];
int top; // 棧頂索引,指向下一個可插入位置
int bottom; // 棧底索引,固定為 0
} Stack, *STACK;
// 接口聲明
int InitStack(STACK s);
int DestroyStack(STACK s);
int ClearStack(STACK s);
int StackEmpty(STACK s);
int GetTop(STACK s, int *e);
int Push(STACK s, int *e);
int Pop(STACK s, int *e);
int StackLength(STACK s, int *len);
int PrintStack(STACK s);
int StackFull(STACK s);
#endif
stack.cint InitStack(STACK s) {
if (!s) return ERROR;
s->top = s->bottom = 0;
return OK;
}
int DestroyStack(STACK s) {
if (!s) return OK; // 允許傳 NULL
s->top = s->bottom = 0;
// 順序棧無動態內存,無需 free
return OK;
}
int StackEmpty(STACK s) {
return (s && s->top == s->bottom) ? ERROR : OK; // 空返回 ERROR
}
int StackFull(STACK s) {
return (s && s->top >= MAX) ? ERROR : OK; // 滿返回 ERROR
}
int StackLength(STACK s, int *len) {
if (!s) return ERROR;
*len = s->top - s->bottom;
return OK;
}
int Push(STACK s, int *e) {
if (StackFull(s) == ERROR) return ERROR;
s->data[s->top++] = *e;
return OK;
}
int Pop(STACK s, int *e) {
if (StackEmpty(s) == ERROR) return ERROR;
*e = s->data[--s->top];
return OK;
}
int GetTop(STACK s, int *e) {
if (StackEmpty(s) == ERROR) return ERROR;
*e = s->data[s->top - 1];
return OK;
}
int ClearStack(STACK s) {
if (StackEmpty(s) == ERROR) return ERROR; // 已空視為錯誤
s->top = s->bottom;
return OK;
}
int PrintStack(STACK s) {
if (StackEmpty(s) == ERROR) return ERROR;
for (int i = 0; i < s->top; ++i)
printf("%d ", s->data[i]);
putchar('\n');
return OK;
}
#include "stack.h"
int main() {
Stack st; int val;
if (InitStack(&st) == ERROR) return 1;
for (int i = 0; i < 10; ++i) Push(&st, &i);
while (Pop(&st, &val) == OK) printf("%d ", val); // 9 8 ... 0
putchar('\n');
StackLength(&st, &val); printf("len=%d\n", val); // 0
PrintStack(&st); // 空棧報錯
return 0;
}
OK/ERROR,調用者必檢查,健壯性強。StackFull 防止上溢,StackEmpty 防止下溢。data 改為 int*,Push 滿時 realloc 翻倍。void* 存儲任意類型,配合 element_size 與拷貝/銷毀回調。pthread_mutex_t。順序棧代碼簡短卻蘊含數據結構封裝、錯誤處理、內存管理等核心思想,是 C 語言進階的絕佳練手項目。