表達式求值採用兩個棧:操作數棧存數字,運算符棧存運算符。掃描字符串時,根據運算符優先級決定是入棧還是先計算棧頂運算。
| 運算符 | 優先級 |
|---|---|
| ( | 0 (最低,僅作標記) |
| + - | 1 |
| * / | 2 |
| ) | 3 (觸發計算直到遇到 '(') |
'(':無條件壓入運算符棧。')':依次彈出計算,直到彈出 '(' 為止(括號不參與計算)。'(' 視為最低,任何運算符優先級均大於它,保證括號內優先計算。// 運算符優先級
int Judge_optr(char ch) {
switch(ch) {
case '(': return 0;
case '+': case '-': return 1;
case '*': case '/': return 2;
case ')': return 3;
}
return -1;
}
// 執行具體運算
double Operate(double b, double a, char op) {
switch(op) {
case '+': return b + a;
case '-': return b - a;
case '*': return b * a;
case '/': return (a == 0) ? 0 : b / a; // 需處理除零
}
return 0;
}
atof 轉換。