本專欄持續輸出數據結構題目集,歡迎訂閱。
文章目錄
- 題目
- 代碼
題目
請編寫程序,求給定的后綴表達式的值。
輸入格式:
輸入在一行中給出一個非空后綴表達式,其中操作數為 int 型整數,操作符包括加、減、乘、除、取模。各項之間以空格分隔。表達式字符串(包括空格)長度小于 1000。題目保證正確計算的過程中不會產生溢出。
輸出格式:
在一行中輸出后綴表達式的值。注意全部計算都是整數運算,結果僅取整數。
以下情況需要輸出錯誤信息:
計算除法時發現分母為 0,輸出 錯誤:除法操作分母為零。;
計算取模時發現除數為 0,輸出 錯誤:取模操作除數為零。;
發現表達式錯誤時,輸出 錯誤:表達式不規范。;
無法正確計算出結果時,輸出 10^9。
輸入樣例 1:
23 16 18 2 * 11 / 117 5 % + - +
輸出樣例 1:
34
輸入樣例 2:
23 0 %
輸出樣例 2:
錯誤:取模操作除數為零。
1000000000
代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>#define MAX_STACK_SIZE 1000
#define ERROR_VALUE 1000000000typedef struct {int data[MAX_STACK_SIZE];int top;
} Stack;void initStack(Stack *s) {s->top = -1;
}int isEmpty(Stack *s) {return s->top == -1;
}void push(Stack *s, int value) {s->data[++(s->top)] = value;
}int pop(Stack *s) {return s->data[(s->top)--];
}int peek(Stack *s) {return s->data[s->top];
}int main() {Stack stack;initStack(&stack);char token[1000];int error = 0;// 讀取輸入直到行尾while (scanf("%s", token) != EOF) {// 判斷是否為操作數if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) {int num = atoi(token);push(&stack, num);} // 判斷是否為操作符else if (strlen(token) == 1) {char op = token[0];if (op == '+' || op == '-' || op == '*' || op == '/' || op == '%') {if (stack.top < 1) {error = 1;break;}int b = pop(&stack);int a = pop(&stack);int result;switch (op) {case '+':result = a + b;break;case '-':result = a - b;break;case '*':result = a * b;break;case '/':if (b == 0) {printf("錯誤:除法操作分母為零。\n");printf("%d\n", ERROR_VALUE);return 0;}result = a / b;break;case '%':if (b == 0) {printf("錯誤:取模操作除數為零。\n");printf("%d\n", ERROR_VALUE);return 0;}result = a % b;break;default:error = 1;break;}if (error) break;push(&stack, result);} else {error = 1;break;}} else {error = 1;break;}}// 檢查表達式是否規范if (error || stack.top != 0) {printf("錯誤:表達式不規范。\n");printf("%d\n", ERROR_VALUE);return 0;}// 輸出結果printf("%d\n", pop(&stack));return 0;
}