typedef int SElemType;
typedef struct StackNode {
SElemType data;
struct StackNode *next;
} StackNode, *LinkStackPtr;
typedef struct {
LinkStackPtr top;
int count;
} LinkStack;
Status InitStack(LinkStack *S) {
S->top = NULL; S->count = 0;
return OK;
}
Status ClearStack(LinkStack *S) {
LinkStackPtr p = S->top, q;
while (p) { q = p; p = p->next; free(q); }
S->count = 0; return OK;
}
// 銷毀同 ClearStack 後 free(S) (若 S 為動態分配)
Status StackEmpty(LinkStack S) { return S.count == 0 ? TRUE : FALSE; }
int StackLength(LinkStack S) { return S.count; }
Status GetTop(LinkStack S, SElemType *e) {
if (!S.top) return ERROR;
*e = S->top->data; return OK;
}
Status Push(LinkStack *S, SElemType e) {
LinkStackPtr n = malloc(sizeof(StackNode));
if (!n) return ERROR;
n->data = e; n->next = S->top; S->top = n; S->count++;
return OK;
}
Status Pop(LinkStack *S, SElemType *e) {
if (StackEmpty(*S)) return ERROR;
LinkStackPtr p = S->top;
*e = p->data; S->top = p->next; free(p); S->count--;
return OK;
}
Status StackTraverse(LinkStack S) {
for (LinkStackPtr p = S.top; p; p = p->next)
visit(p->data);
printf("\n"); return OK;
}
| 指標 | 順序堆疊 | 鏈式堆疊 |
|---|---|---|
| 空間複雜度 | O(MAXSIZE) 固定 | O(n) 動態 |
| Push/Pop 時間 | O(1) 純陣列操作 | O(1) 需 malloc/free |
| 記憶體碎片 | 無 | 有 |
| 快取友善度 | 高(連續記憶體) | 低(節點分散) |
| 擴容靈活性 | 需重新分配複製 | 天然支援 |
| 最大容量 | 受限於預分配 | 受限於記憶體 |
在 LinkStack 中加入 pthread_mutex_t lock,Push/Pop/Clear 加鎖保護。無鎖版本可用 __sync_bool_compare_and_swap 實現 top 原子更新(ABA 問題需標記指標)。
參考《大話資料結構》。