首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

鏈式堆疊(Linked Stack)C語言完整實現與動態特性分析

     編輯:關於C

資料結構定義

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;
}

順序堆疊 vs 鏈式堆疊對比

指標順序堆疊鏈式堆疊
空間複雜度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 問題需標記指標)。

參考《大話資料結構》。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved