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

順序棧C語言完整實現:從入門到工程化

     編輯:關於C語言

順序棧基礎結構

#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef struct {
    SElemType data[MAXSIZE];
    int top; // 棧頂指針,-1 表示空
} SqStack;

核心操作集

操作函數簽名關鍵邏輯
初始化InitStack(SqStack *S)S->top = -1
清空ClearStack(SqStack *S)S->top = -1
判空StackEmpty(SqStack S)return S.top == -1
長度StackLength(SqStack S)return S.top + 1
取棧頂GetTop(SqStack S, SElemType *e)空檢查後 *e = S.data[S.top]
入棧Push(SqStack *S, SElemType e)滿檢查 top == MAXSIZE-1,data[++top]=e
出棧Pop(SqStack *S, SElemType *e)空檢查,*e = data[top--]
遍歷StackTraverse(SqStack S)從 0 到 top 依次 visit

完整代碼整合

#include <stdio.h>
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
#define OK 1; #define ERROR 0; #define TRUE 1; #define FALSE 0

typedef struct { SElemType data[MAXSIZE]; int top; } SqStack;

Status InitStack(SqStack *S) { S->top = -1; return OK; }
Status ClearStack(SqStack *S) { S->top = -1; return OK; }
Status StackEmpty(SqStack S) { return S.top == -1 ? TRUE : FALSE; }
int StackLength(SqStack S) { return S.top + 1; }
Status GetTop(SqStack S, SElemType *e) { 
    if (S.top == -1) return ERROR; 
    *e = S.data[S.top]; return OK; 
}
Status Push(SqStack *S, SElemType e) {
    if (S->top == MAXSIZE - 1) return ERROR;
    S->data[++S->top] = e;
    return OK;
}
Status Pop(SqStack *S, SElemType *e) {
    if (S->top == -1) return ERROR;
    *e = S->data[S->top--];
    return OK;
}
Status visit(SElemType c) { printf("%d ", c); return OK; }
Status StackTraverse(SqStack S) {
    for (int i = 0; i <= S.top; i++) visit(S.data[i]);
    printf("\n"); return OK;
}

// 測試主程式
int main() {
    SqStack S; int e;
    InitStack(&S);
    Push(&S, 10); Push(&S, 20); Push(&S, 30);
    printf("棧長度: %d\n", StackLength(S)); // 3
    StackTraverse(S); // 10 20 30
    GetTop(S, &e); printf("棧頂: %d\n", e); // 30
    Pop(&S, &e); printf("彈出: %d\n", e); // 30
    StackTraverse(S); // 10 20
    return 0;
}

工程化改進方向

  1. 動態擴容:滿時 realloc 擴大陣列,支援任意大小。
  2. 泛型支援:用 void* 存儲任意類型,配合銷毀回調函數。
  3. 線程安全:加入互斥鎖,實現線程安全棧。
  4. 迭代器模式:提供 StackIterator 統一遍歷介面。

常見錯誤避坑

  • 顯式初始化:局部變數 SqStack S; 未初始化 top 會導致未定義行為,必須調用 InitStack。
  • 參數傳遞:GetTop 參數用值傳遞 SqStack S 即可(不修改),Push/Pop 必須用指標 SqStack *S。
  • 越界訪問:Pop 前必須判空,否則 top-- 導致負索引訪問。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved