给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。用cpp语言
时间: 2024-11-12 07:44:33 浏览: 17
在C++中,你可以使用栈数据结构来解决这个问题,因为栈可以用于处理递归的操作,例如解析算术表达式。这里我们可以使用前缀表示法(也称为逆波兰表示法),这样计算过程会更简单。以下是简单的步骤:
1. **解析输入**:将给定的表达式转换成逆波兰表示法的元素列表。这通常涉及到两个指针遍历输入字符串,遇到操作符就推入栈中,遇到数字则读取并存储。
2. **计算**:创建一个函数来处理栈中的元素。对于每个元素,如果它是数字,就将其压入结果变量;如果是操作符,弹出最近的两个数字进行相应的加法或乘法运算,并把结果压回栈中。
3. **求解**:最后,栈中剩下的数字就是最终的结果。
```cpp
#include <iostream>
#include <stack>
#include <string>
int precedence(char op) {
if (op == '+' || op == '-') return 1;
else if (op == '*' || op == '/') return 2;
return 0;
}
int applyOperator(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // 注意除法可能会导致整数溢出,这里假设不会遇到这种情况
}
}
int evaluate(std::string expression) {
std::stack<int> values;
std::stack<char> ops;
for (size_t i = 0; i < expression.size(); ++i) {
if (isdigit(expression[i])) {
int val = 0;
while (i < expression.size() && isdigit(expression[i]))
val = 10 * val + (expression[i++] - '0');
values.push(val);
} else {
while (!ops.empty() && precedence(ops.top()) >= precedence(expression[i]))
values.push(applyOperator(values.top(), values.pop(), ops.top()));
ops.push(expression[i]);
}
}
// Apply any remaining operations
while (!ops.empty())
values.push(applyOperator(values.top(), values.pop(), ops.top()));
return values.top();
}
int main() {
std::string expression = "2*3+4";
int result = evaluate(expression);
std::cout << "The value of the expression is: " << result << std::endl;
return 0;
}
```
阅读全文