利用棧結構實現算術表達式計算,展示運算符優先級解析與兩棧協作的兩種核心思路,附完整可運行代碼。
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef int SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
算法流程:
# 作為界限Precede():
<:運算符入棧=:脫括號,彈出 (>:彈出運算符與兩操作數,計算,結果入 OPND# 且棧頂 # 結束,OPND 棧頂為結果
SElemType Precede(SElemType top, SElemType curr) {
// 返回 '<', '>', '='
// 實現運算符優先級邏輯:*/ > +-,括號最高
}
C++ 版本核心:
// 運算符優先級矩陣
unsigned char Prior[8][8] = { ... };
float EvaluateExpression(char* expr) {
StackChar *OPTR = NULL;
StackFloat *OPND = NULL;
// 掃描表達式字符
// 數字解析入 OPND
// 運算符按優先級矩陣處理
// 遇 # 結束
return OPND->f;
}
In(c):判斷是否運算符Operate(a, op, b):執行二元運算Push/Pop:棧操作輸入: 3*(7-5)# 輸出: 6
| 維度 | 雙棧直接計算 | 中綴轉後綴 |
|---|---|---|
| 直觀性 | 高 | 中(需理解後綴) |
| 擴展性 | 難擴展函數/一元運算符 | 易擴展 |
| 教學價值 | 棧應用直觀 | 編譯原理基礎 |
表達式求值是棧應用的教科書級案例,深度理解其機制有助於掌握編譯器前端核心技術。