我们人类习惯于书写“中缀式”,如 3 + 5 * 2 ,其值为13。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?) 而计算机更加习惯“后缀式”(也叫“逆波兰式”,Reverse Polish Notation)。上述中缀式对应的后缀式是: 3 5 2 * + 现在,请对输入的后缀式进行求值。为了简化输入处理和运算,运算数(操作数)不超过300个且均为1位正整数,运算符(操作符)仅有+ - * /(加减乘除)四种,运算数和运算符之间没有空格间隔,且题目保证运算的中间结果和最终结果都在整型范围内。 但是注意,题目输入的后缀式可能错误,例如: 1234+- 错误,缺少运算符 123+-* 错误,缺少运算数 122-/ 错误,除数为0 题目保证以上三种错误不会同时发生。使用C语言编程
时间: 2024-02-23 14:03:09 浏览: 98
以下是使用C语言编写的求解后缀表达式的代码,其中假设后缀表达式存储在一个字符数组中,且运算数均为1位正整数:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
char postfix[301]; // 存储后缀表达式
scanf("%s", postfix);
int stack[301]; // 定义一个栈来存储运算数
int top = -1; // 栈顶指针初始化为-1
for (int i = 0; postfix[i] != '\0'; i++) {
if (postfix[i] >= '0' && postfix[i] <= '9') {
// 当前字符是数字,则将其转换为整数并压入栈中
stack[++top] = postfix[i] - '0';
} else {
// 当前字符是运算符,从栈中弹出两个运算数进行计算
int b = stack[top--];
int a = stack[top--];
switch (postfix[i]) {
case '+': stack[++top] = a + b; break;
case '-': stack[++top] = a - b; break;
case '*': stack[++top] = a * b; break;
case '/': stack[++top] = a / b; break;
}
}
}
printf("%d\n", stack[0]); // 栈中最后剩下的元素即为所求的表达式值
return 0;
}
```
此程序先定义了一个字符数组用于存储后缀表达式,然后使用`scanf`函数从标准输入中读入后缀表达式。接着定义了一个整型数组作为栈,以及一个变量`top`表示栈顶指针,初始化为-1。程序遍历后缀表达式中的每个字符,如果当前字符是数字,则将其转换为整数并压入栈中;如果当前字符是运算符,则从栈中弹出两个运算数进行计算,并将计算结果压入栈中。遍历完整个表达式后,栈中最后剩下的元素即为所求的表达式值,将其输出即可。
阅读全文