表達式求值是經典棧應用。本文先給出不含括號的版本,再擴展支持括號。核心思想:兩個棧——操作數棧、操作符棧,利用運算符優先級決定何時計算。
#define STACK_INIT_SIZE 100
typedef struct { char data[STACK_INIT_SIZE]; int top; } OptrStack; // 操作符棧
typedef struct { double data[STACK_INIT_SIZE]; int top; } OpndStack; // 操作數棧
int Judge_optr(char op) {
switch (op) {
case '(': return 0;
case '+': case '-': return 1;
case '*': case '/': return 2;
case ')': return 3;
}
}
// 掃描主循環中 case '(' '+' '-' 合並:
if ((!Empty_OptrStack(optr)) || (Judge_optr(str[i]) > Judge_optr(GetTop_OptrStack(optr, top))) || (str[i]=='('))
Push_OptrStack(optr, str[i]);
else { /* 彈出計算 */ }
// case ')' :
Push_OptrStack(optr, str[i]); break;
// 最終清理:
while (Empty_OptrStack(optr)) {
if (GetTop_OptrStack(optr, top) == ')' || GetTop_OptrStack(optr, top) == '(')
top = Pop_OptrStack(optr, top); // 丟棄括號
else { /* 彈出計算 */ }
}
完整代碼包含:棧初始化/判空/入棧/出棧/取頂、運算符判斷、運算執行、主掃描函數、main 測試。因篇幅限制,此處給出核心邏輯,完整可運行代碼請參考原文附件。
輸入:(1+2)*3-4/2 輸出:該表達式的計算結果為:7