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

C 語言順序棧實現:數組封裝與完整操作接口

     編輯:關於C語言

C 語言順序棧實現:數組封裝與完整操作接口

棧是後進先出(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.c

初始化與銷毀

int 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,調用者必檢查,健壯性強。
  • 參數傳址:出參用指針,避免大結構體拷貝,符合 C 慣例。
  • 邊界防護:StackFull 防止上溢,StackEmpty 防止下溢。
  • 擴展方向:
    • 動態擴容:data 改為 int*,Push 滿時 realloc 翻倍。
    • 泛型化:用 void* 存儲任意類型,配合 element_size 與拷貝/銷毀回調。
    • 線程安全:加入 pthread_mutex_t。

順序棧代碼簡短卻蘊含數據結構封裝、錯誤處理、內存管理等核心思想,是 C 語言進階的絕佳練手項目。

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