輸入形如3+5*2的表達式,僅用printf/scanf/switch/if實現正確運算,核心難點在於運算符優先級處理(乘除先於加減)。
這是編譯原理中經典的表達式求值算法,邏輯清晰且可擴展:
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
double compute(double a, double b, char op) {
switch(op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return b != 0 ? a / b : 0; // 除零保護
}
return 0;
}
// 主循環邏輯
while (/* 還有字符 */) {
if (isdigit(ch)) { /* 處理多位數入操作數棧 */ }
else if (isOperator(ch)) {
while (!opStack.empty() && precedence(opStack.top()) >= precedence(ch)) {
// 執行棧頂運算
}
opStack.push(ch);
}
}
若確定輸入格式固定為數字 運算符 數字 運算符 數字,可簡化為:
double a, b, c; char op1, op2;
scanf("%lf %c %lf %c %lf", &a, &op1, &b, &op2, &c);
double result;
if (precedence(op2) > precedence(op1)) {
// 先算第二個運算
double temp = compute(b, c, op2);
result = compute(a, temp, op1);
} else {
// 先算第一個運算
double temp = compute(a, b, op1);
result = compute(temp, c, op2);
}
printf("結果: %.2f", result);
scanf需正確處理空格、換行,建議用%lf %c %lf %c %lf格式「三數四則運算」看似簡單,實則是表達式求值的縮影。掌握雙棧法不僅能解決當前問題,更能打下編譯原理、解析器構建的基礎。建議先實現專用簡化版通過作業,再挑戰通用雙棧版提升內功。