順序棧基礎結構
#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;
}
工程化改進方向
- 動態擴容:滿時
realloc 擴大陣列,支援任意大小。
- 泛型支援:用
void* 存儲任意類型,配合銷毀回調函數。
- 線程安全:加入互斥鎖,實現線程安全棧。
- 迭代器模式:提供
StackIterator 統一遍歷介面。
常見錯誤避坑
- 顯式初始化:局部變數
SqStack S; 未初始化 top 會導致未定義行為,必須調用 InitStack。
- 參數傳遞:
GetTop 參數用值傳遞 SqStack S 即可(不修改),Push/Pop 必須用指標 SqStack *S。
- 越界訪問:
Pop 前必須判空,否則 top-- 導致負索引訪問。