C++实现:简单易懂的中缀表达式转前缀表达式代码及注意事项
要将中缀表达式转换为前缀表达式(也称为波兰表达式),我们需要使用栈来处理操作符的优先级和括号。下面是一个简单的C++程序,可以实现这一转换。 ```cpp #include <iostream> #include <stack> #include <string> #include <cctype> #include <sstream> using namespace std; // 判断一个字符是否是操作符 bool isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 获取操作符的优先级 int precedence(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; return 0; } // 将中缀表达式转换为前缀表达式 string infixToPrefix(const string& expr) { stack<char> opStack; stringstream result; string token; stringstream ss(expr); while (getline(ss, token, ' ')) { // 跳过空字符串 if (token.empty()) continue; // 如果是数字,直接输出 if (isdigit(token[0])) { result << token << ' '; } // 如果是左括号,压入栈 else if (token == "(") { opStack.push(token[0]); } // 如果是右括号,弹出栈顶操作符直到遇到左括号 else if (token == ")") { while (!opStack.empty() && opStack.top() != '(') { result << opStack.top() << ' '; opStack.pop(); } opStack.pop(); // 弹出左括号 } // 如果是操作符 else if (isOperator(token[0])) { while (!opStack.empty() && precedence(opStack.top()) >= precedence(token[0])) { result << opStack.top() << ' '; opStack.pop(); } opStack.push(token[0]); } } // 将栈中剩余的操作符弹出 while (!opStack.empty()) { result << opStack.top() << ' '; opStack.pop(); } // 去除末尾的空格并返回结果 string prefixExpr = result.str(); prefixExpr.pop_back(); return prefixExpr; } int main() { string expr; cout << "请输入中缀表达式: "; getline(cin, expr); string prefixExpr = infixToPrefix(expr); cout << "前缀表达式: " << prefixExpr << endl; return 0; } ``` 注意事项: 1. 输入处理:这里假设输入的中缀表达式中的元素(数字和操作符)之间是用空格分隔的。如果你的输入没有空格,你需要先对输入进行预处理,将其拆分成单独的符号和数字。 2. 错误处理:本程序未包含对非法输入的处理(例如不匹配的括号)。在实际应用中,应增加对这类错误的检测和处理。 3. 性能考虑:对于非常长的表达式,程序的性能可能会受到影响。可以进一步优化栈操作和字符串拼接来提高效率。 ######[AI写代码神器 | 735点数解答 | 2025-03-12 18:13:50]
- 递归下降语法分析程序实例:从文法到 C 代码的完整实现(字节豆包 | 1371点数解答 | 2024-12-12 22:46:04)262
- SQL 实现:精准查询 20 岁选课学生学号、姓名、平均与总成绩(去重取最高) (字节豆包 | 116点数解答 | 2024-10-21 00:46:57)212
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- 多领域“易懂”大揭秘:从语言到代码的清晰秘诀(字节豆包 | 283点数解答 | 2025-07-29 10:02:47)71
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)457
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)354
- Java:设计圆类与圆柱体类并计算属性及体积表面积(字节豆包 | 470点数解答 | 2024-10-20 10:03:11)181
- Java 实现矩形与长方体类,精准计算底面积与体积(字节豆包 | 319点数解答 | 2024-10-20 10:25:46)286
- Java 实现矩形与长方体类,轻松计算底面积和体积(字节豆包 | 308点数解答 | 2024-10-20 10:34:27)272
- Java 实现矩形与长方体类:计算底面积与体积的完整代码示例(字节豆包 | 306点数解答 | 2024-10-20 18:34:47)272
- 云南 8 日摄影行程表 HTML 代码优化与逻辑注意点揭秘(字节豆包 | 217点数解答 | 2025-03-09 13:19:03)264