本专栏持续输出数据结构题目集,欢迎订阅。
文章目录
- 题目
- 代码
题目
请编写程序,求给定的后缀表达式的值。
输入格式:
输入在一行中给出一个非空后缀表达式,其中操作数为 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;
}