求前缀表达式的值c语言
时间: 2024-11-15 09:22:44 浏览: 35
求前缀表达式(也称为逆波兰表示法,Prefix Notation)的值,在C语言中可以使用栈数据结构来实现。前缀表达式的计算顺序是从左到右,遇到运算符就将操作数压入栈,遇到操作数则弹出最近的两个操作数进行运算,然后将结果压回栈。下面是一个简单的C语言函数示例:
```c
#include <stdio.h>
#include <stdlib.h>
int precedence(char op) {
// 假设运算符优先级从0到9,你可以自定义优先级规则
return op - '0';
}
double applyOp(char op, double b, double a) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': if (b != 0) return a / b; else return 0; // 防止除以零
default: return 0; // 如果遇到未知的运算符,返回0
}
}
double evaluate(char* exp) {
stack<double> values;
stack<char> ops;
for (char token; *exp; exp++) {
if (isdigit(*exp)) { // 遇到数字,直接入栈
double num = 0;
while (isdigit(*exp)) {
num = num * 10 + (*exp - '0');
exp++;
}
values.push(num);
} else if (*exp == '(') { // 遇到左括号,入栈
ops.push(*exp);
} else if (*exp == ')') { // 遇到右括号,直到找到左括号为止
while (!ops.empty() && ops.top() != '(') {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(op, val1, val2));
}
if (!ops.empty()) {
ops.pop(); // 弹出左括号
}
} else { // 遇到运算符,先处理已存在的运算符
while (!ops.empty() && precedence(ops.top()) >= precedence(*exp)) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(op, val1, val2));
}
ops.push(*exp); // 运算符入栈
}
}
// 最后的运算
while (!ops.empty()) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(op, val1, val2));
}
return values.top(); // 返回最终的结果
}
int main() {
char exp[] = "2 3 + 4 *";
printf("The value of the prefix expression is: %.2f\n", evaluate(exp));
return 0;
}
```
阅读全文