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

C語言靜態數組實現棧:固定容量、O(1)操作的極簡模型

     編輯:關於C

適用場景

  • 最大深度可預估且固定(如表達式求值、遞歸轉迭代、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;
}

優缺點總結

優點缺點
零動態分配,無碎片、無洩漏容量固定,溢出需自行處理
極快(連續內存,緩存友好)無法適應運行時未知深度
代碼極簡,適合教學/嵌入式佔用棧空間(若作局部變數)

擴展建議

  1. 改用 void* 支援泛型元素(需外部管理元素生命週期)。
  2. 加入 capacity 字段,配合 realloc 實現動態擴容(變為動態數組棧)。
  3. 多線程環境添加自旋鎖或互斥鎖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved