C++实现前缀表达式求值及代码详解
### 💻前缀表达式求值原理 前缀表达式(波兰式)是一种将运算符置于操作数之前的表达式表示方法。计算前缀表达式的值,通常使用栈来实现。从右到左扫描表达式,遇到操作数就压入栈,遇到运算符就从栈中弹出相应数量的操作数进行计算,再将结果压回栈,扫描结束后栈顶元素就是表达式的值。 ### 📝代码实现 ```cpp #include <iostream> #include <stack> #include <sstream> #include <string> #include <cctype> // 计算前缀表达式的值 double evaluatePrefix(const std::string& expression) { std::stack<double> stack; std::istringstream iss(expression); std::string token; // 从右到左扫描 for (auto it = expression.rbegin(); it != expression.rend(); ++it) { if (*it == ' ') continue; std::string num; while (it != expression.rend() && (std::isdigit(*it) || *it == '.')) { num = *it + num; ++it; } if (!num.empty()) { stack.push(std::stod(num)); if (it != expression.rend()) --it; } else { double operand1 = stack.top(); stack.pop(); double operand2 = stack.top(); stack.pop(); switch (*it) { case '+': stack.push(operand1 + operand2); break; case '-': stack.push(operand1 - operand2); break; case '*': stack.push(operand1 * operand2); break; case '/': if (operand2 != 0) { stack.push(operand1 / operand2); } else { std::cerr << "Error: Division by zero" << std::endl; return 0; } break; default: std::cerr << "Error: Invalid operator" << std::endl; return 0; } } } return stack.top(); } int main() { std::string expression; std::cout << "Enter a prefix expression: "; std::getline(std::cin, expression); double result = evaluatePrefix(expression); std::cout << "Result: " << result << std::endl; return 0; } ``` ### 🧐代码解释 - `evaluatePrefix` 函数用于计算前缀表达式的值。 - 使用 `std::stack` 存储操作数。 - 从右到左扫描表达式,将操作数压入栈,遇到运算符就从栈中弹出操作数计算,再将结果压入栈。 - `main` 函数负责读取用户输入的表达式,调用 `evaluatePrefix` 函数计算结果并输出。 ### ⚠️注意事项 代码假设输入的前缀表达式格式正确且不包含非法字符,若输入包含除数字、运算符和空格之外的字符,程序可能出错。 ######[AI问答 | 725点数解答 | 2026-03-01 20:20:28]
- 递归下降语法分析程序实例:从文法到 C 代码的完整实现(字节豆包 | 1371点数解答 | 2024-12-12 22:46:04)257
- SQL 实现:精准查询 20 岁选课学生学号、姓名、平均与总成绩(去重取最高) (字节豆包 | 116点数解答 | 2024-10-21 00:46:57)207
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)333
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)217
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)298
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)437
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)345
- JavaScript 开发揭秘:表达式 {{data}} 的工作原理及模板字符串应用(阿里通义 | 226点数解答 | 2023-11-09 01:17:26)234
- 揭秘!Angular表达式 {{yourmodel}} 的工作原理与灵活应用(阿里通义 | 187点数解答 | 2023-11-09 01:18:41)205
- Python 实现实数四则运算:输入表达式输出结果,处理除零与格式错误(字节豆包 | 286点数解答 | 2024-11-17 11:21:58)113
- C 语言实现:输入实数四则运算式输出保留两位小数结果(含特殊情况处理) (字节豆包 | 320点数解答 | 2024-11-17 11:22:27)137
- iOS开发:手把手教你完整实现代理模式,含声明与实现步骤!(阿里通义 | 268点数解答 | 2023-11-08 00:39:55)241