写一个cpp程序,实现把一个只有加法乘法的中缀表达式转换成逆波兰表达式,并且求值
时间: 2024-11-13 10:40:46 浏览: 8
在C++中,我们可以使用栈数据结构来实现从中缀表达式到逆波兰表达式的转换,然后利用另一个栈来计算逆波兰表达式的值。这里是一个简单的示例:
```cpp
#include <iostream>
#include <stack>
#include <string>
std::string infixToRPN(const std::string &infix) {
std::stack<std::pair<char, int>> stack;
std::string rpn = "";
for (char c : infix) {
if (c == '+' || c == '*' || c >= '0' && c <= '9') {
// 如果遇到数字或操作符
if (!stack.empty() && (isalnum(stack.top().first) || stack.top().first == '(')) {
// 将前面的操作数压入结果并弹出栈顶元素
rpn += stack.top().second + " ";
stack.pop();
}
stack.push({c, c}); // 加上空格以便于后期分割
} else if (c == '(') {
stack.push(c);
} else if (c == ')') {
while (!stack.empty() && stack.top() != '(') {
rpn += stack.top().second + " ";
stack.pop();
}
stack.pop(); // 弹出左括号
}
}
// 把剩余的操作数和操作符加入rpn
while (!stack.empty()) {
rpn += stack.top().second + " ";
stack.pop();
}
return rpn;
}
int evaluateRPN(const std::string &rpn) {
std::stack<int> values;
for (char c : rpn) {
if (isdigit(c)) {
values.push(c - '0'); // 转换成整数
} else {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
switch (c) {
case '+': values.push(val1 + val2); break;
case '*': values.push(val1 * val2); break;
default: throw std::runtime_error("Invalid operator");
}
}
}
return values.top();
}
int main() {
std::string infixExp = "A + B * C"; // 中缀表达式
std::string rpnExp = infixToRPN(infixExp);
std::cout << "Infix to RPN: " << rpnExp << std::endl;
try {
int result = evaluateRPN(rpnExp);
std::cout << "Result: " << result << std::endl;
} catch (const std::exception &e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
```
这个程序首先将中缀表达式转换成逆波兰表达式(RPN),然后再计算逆波兰表达式的值。注意,这是一个基础示例,实际处理中可能会考虑更复杂的情况,如优先级、括号等。
阅读全文