波兰表达式c++代码
时间: 2024-11-06 16:12:45 浏览: 17
波兰表达式,也称为逆波兰表示法(Reverse Polish Notation,RPN),是一种数学运算符排列方式,在这种表示法中,操作数在前,操作符在后。在C++中,处理波兰表达式的常见做法是使用栈数据结构。以下是一个简单的C++代码示例,演示如何解析和计算一个基本的波兰表达式:
```cpp
#include <iostream>
#include <stack>
#include <string>
// 函数定义,用于转换算术操作符优先级
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;
}
}
// 主函数,处理输入的波兰表达式
double evaluatePolishExpression(const std::string& exp) {
std::stack<double> values;
std::stack<char> ops;
for (char c : exp) {
if (isdigit(c)) { // 如果字符是数字,直接入栈
double num = 0;
while (isdigit(c)) {
num = num * 10 + c - '0';
++c;
}
values.push(num);
} else if (c == '(') { // 遇到左括号,入栈
ops.push(c);
} else if (c == ')') { // 遇到右括号,计算直到左括号
while (!ops.top() && ops.top() != '(') {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(val1, val2, op));
}
if (ops.top() == '(') {
ops.pop(); // 移除左括号
}
} else { // 遇到操作符,处理优先级
while (!ops.empty() && precedence(op) <= precedence(ops.top())) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char top_op = ops.top();
ops.pop();
values.push(applyOp(val1, val2, top_op));
}
ops.push(op); // 将当前操作符压入堆栈
}
}
// 处理剩余的操作符和数值
while (!ops.empty()) {
double val2 = values.top();
values.pop();
double val1 = values.top();
values.pop();
char op = ops.top();
ops.pop();
values.push(applyOp(val1, val2, op));
}
// 返回最终结果
return values.top();
}
int main() {
std::string expression = "2 3 + 4 *";
double result = evaluatePolishExpression(expression);
std::cout << "Result: " << result << std::endl;
return 0;
}
```
在这个例子中,`evaluatePolishExpression`函数接收一个字符串,然后通过迭代并使用栈来解析和计算它。
阅读全文