輸入一行不超過 30 字符的前綴表達式(運算符與運算元以空格分隔),如 + + 2 * 3 - 7 4 / 8 4,要求計算結果,保留 1 位小數;異常情況輸出 ERROR。
double 入棧。+ - * /),彈出棧頂兩個元素 op1, op2(注意順序),計算 op1 運算符 op2,結果入棧。/ 前判斷 op2 == 0,報錯。strtod 解析失敗視為錯誤。double st[30] 足夠。printf("%.1f\n", result);錯誤時 puts("ERROR")。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_TOKENS 30
int main() {
char line[200];
if (!fgets(line, sizeof(line), stdin)) return 0;
line[strcspn(line, "\n")] = 0; // 去換行
char *tokens[MAX_TOKENS];
int n = 0;
for (char *p = strtok(line, " "); p; p = strtok(NULL, " "))
tokens[n++] = p;
double st[MAX_TOKENS];
int top = -1;
int error = 0;
for (int i = n - 1; i >= 0; i--) {
char *tk = tokens[i];
if (isdigit(tk[0]) || (tk[0]=='-' && isdigit(tk[1]))) {
char *end;
double val = strtod(tk, &end);
if (*end != '\0') { error = 1; break; }
st[++top] = val;
} else if (strlen(tk) == 1 && strchr("+-*/", tk[0])) {
if (top < 1) { error = 1; break; }
double b = st[top--], a = st[top--];
switch (tk[0]) {
case '+': st[++top] = a + b; break;
case '-': st[++top] = a - b; break;
case '*': st[++top] = a * b; break;
case '/':
if (b == 0) { error = 1; }
else st[++top] = a / b;
break;
}
} else { error = 1; break; }
if (error) break;
}
if (error || top != 0) puts("ERROR");
else printf("%.1f\n", st[0]);
return 0;
}
| 輸入 | 輸出 |
|---|---|
+ + 2 * 3 - 7 4 / 8 4 | 13.0 |
/ -25 + * - 2 3 4 / 8 4 | 12.5 |
/ 5 + * - 2 3 4 / 8 2 | ERROR |
+10.23 | 10.2 |
掌握「右掃左算、棧存中間結果」模板,前綴/後綴表達式求值題迎刃而解。