用c++语言实现表达式求值
时间: 2024-09-25 15:17:55 浏览: 35
在C++中,实现一个基本的表达式求值可以利用递归或栈来处理基于运算符的算术表达式。这里是一个简单的例子,使用递归函数来解析和计算前缀(也称为逆波兰表示法,即操作数在前,运算符在后的顺序)表达式:
```cpp
#include <iostream>
#include <stack>
// 定义优先级和对应的运算符
const int PRIO_PLUS = 1;
const int PRIO_MINUS = 2;
const int PRIO_MULTIPLY = 3;
const int PRIO_DIVIDE = 4;
int applyOperator(int op, int b, int a) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b; // 注意除法需要检查避免除零错误
default:
throw std::invalid_argument("Invalid operator");
}
}
int evaluate(const std::string& exp) {
std::stack<int> values;
for (char c : exp) {
if (isdigit(c)) {
values.push(c - '0'); // 将字符转换为数字并压入栈
} else { // 遇到运算符
int right = values.top(); values.pop();
int left = values.top(); values.pop();
values.push(applyOperator(c - '0', right, left));
}
}
return values.top(); // 返回最终结果
}
int main() {
std::string exp = "2 3 + 5 *";
try {
int result = evaluate(exp);
std::cout << "Result of expression is: " << result << std::endl;
} catch (const std::invalid_argument& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
```
在这个示例中,`evaluate`函数逐个遍历输入字符串,如果是数字就直接压入栈,遇到运算符则弹出最近的两个数应用运算符,并将结果压回栈。最后栈顶剩余的就是整个表达式的计算结果。
阅读全文