给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数 用c语言写一个程序。
时间: 2024-09-24 19:04:41 浏览: 37
逆波兰表达式求值
在C语言中,我们可以编写一个函数来解析逆波兰表示法(也称为后缀表达式)的字符串,并计算其结果。下面是一个简单的程序结构:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stack>
// 定义运算符优先级
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
// 比较运算符优先级并进行相应的操作
double applyOp(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // 注意除数不能为0
}
}
// 主函数处理逆波兰表达式
double evaluatePostfix(char* tokens) {
stack<double> nums;
stack<char> ops;
for (char token : tokens) {
if (isdigit(token)) { // 如果是数字,直接入栈
nums.push(atof(token));
} else { // 否则,取出栈顶的两个元素进行操作
double val2 = nums.top();
nums.pop();
double val1 = nums.top();
nums.pop();
while (!ops.empty() && precedence(ops.top()) >= precedence(token)) {
val1 = applyOp(val1, nums.top(), ops.top());
nums.pop();
ops.pop();
}
nums.push(val1); // 将操作后的结果压回栈
ops.push(token);
}
}
// 最后一次操作会将剩余的操作数和运算符推到栈顶
while (!ops.empty()) {
double val2 = nums.top();
nums.pop();
double val1 = nums.top();
nums.pop();
val1 = applyOp(val1, val2, ops.top());
nums.pop();
ops.pop();
}
return nums.top(); // 返回最终结果
}
int main() {
char* tokens = "2 1 + 3 *"; // 示例输入的逆波兰表达式
double result = evaluatePostfix(tokens);
printf("计算结果: %lf\n", result);
return 0;
}
```
这个程序首先创建两个栈,一个用于存储数字,另一个用于存储运算符。遍历输入的逆波兰表达式的每个字符,如果是数字就入栈,如果是运算符则先处理高优先级的运算符直到遇到当前运算符的优先级更低或到达栈底。然后应用运算符进行计算并将结果放回栈中。最后,只剩下一个元素在栈顶,即为表达式的最终结果。
阅读全文