本专栏持续输出数据结构题目集,欢迎订阅。
文章目录
题目
请编写程序,求给定的后缀表达式的值。
输入格式:
输入在一行中给出一个非空后缀表达式,其中操作数为 int 型整数,操作符包括加、减、乘、除、取模。各项之间以空格分隔。表达式字符串(包括空格)长度小于 1000。题目保证正确计算的过程中不会产生溢出。
输出格式:
在一行中输出后缀表达式的值。注意全部计算都是整数运算,结果仅取整数。
以下情况需要输出错误信息:
计算除法时发现分母为 0,输出 错误:除法操作分母为零。;
计算取模时发现除数为 0,输出 错误:取模操作除数为零。;
发现表达式错误时,输出 错误:表达式不规范。;
无法正确计算出结果时,输出 10^9。
输入样例 1:
23 16 18 2 * 11 / 117 5 % + - +
输出样例 1:
34
输入样例 2:
23 0 %
输出样例 2:
错误:取模操作除数为零。
1000000000
代码
cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STACK_SIZE 1000
#define ERROR_VALUE 1000000000
typedef 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;
}