C++实现:中缀表达式秒转前缀表达式,附详细代码与解释!
# 中缀表达式转前缀表达式 这是一个将中缀表达式转换为前缀表达式的问题。前缀表达式(波兰表示法)将运算符放在操作数之前。 ## 解决方案 ```cpp #include <iostream> #include <stack> #include <string> #include <algorithm> #include <cctype> using namespace std; // 判断运算符优先级 int precedence(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; return 0; } // 中缀转前缀函数 string infixToPrefix(const string& infix) { stack<char> operators; stack<string> operands; // 从右向左扫描中缀表达式 for (int i = infix.length() - 1; i >= 0; i--) { // 跳过空格 if (infix[i] == ' ') continue; // 如果是右括号,压入运算符栈 if (infix[i] == ')') { operators.push(infix[i]); } // 如果是左括号 else if (infix[i] == '(') { // 弹出直到遇到右括号 while (!operators.empty() && operators.top() != ')') { string op1 = operands.top(); operands.pop(); string op2 = operands.top(); operands.pop(); char op = operators.top(); operators.pop(); string temp = string(1, op) + " " + op1 + " " + op2; operands.push(temp); } // 弹出右括号 operators.pop(); } // 如果是操作数 else if (isdigit(infix[i])) { string num; // 处理多位数 while (i >= 0 && isdigit(infix[i])) { num = infix[i] + num; i--; } i++; // 补偿多减的1 operands.push(num); } // 如果是运算符 else { // 处理栈顶优先级更高的运算符 while (!operators.empty() && precedence(operators.top()) > precedence(infix[i])) { string op1 = operands.top(); operands.pop(); string op2 = operands.top(); operands.pop(); char op = operators.top(); operators.pop(); string temp = string(1, op) + " " + op1 + " " + op2; operands.push(temp); } operators.push(infix[i]); } } // 处理剩余运算符 while (!operators.empty()) { string op1 = operands.top(); operands.pop(); string op2 = operands.top(); operands.pop(); char op = operators.top(); operators.pop(); string temp = string(1, op) + " " + op1 + " " + op2; operands.push(temp); } return operands.top(); } int main() { string infix; getline(cin, infix); string prefix = infixToPrefix(infix); cout << prefix << endl; return 0; } ``` ## 代码解释 1. precedence函数:确定运算符的优先级,乘除高于加减。 2. infixToPrefix函数: - 使用两个栈:一个存储运算符,一个存储操作数。 - 从右向左扫描中缀表达式。 - 遇到数字时,收集完整数字后压入操作数栈。 - 遇到右括号直接压入运算符栈。 - 遇到左括号时,弹出运算符直到遇到右括号。 - 遇到运算符时,处理栈中优先级更高的运算符。 - 最后处理剩余的运算符。 3. 主函数:读取输入,调用转换函数,输出结果。 ## 注意事项 1. 算法从右向左扫描中缀表达式,这与常规的中缀转后缀算法方向相反。 2. 处理多位数时需要特别注意索引的调整。 3. 输出格式要求运算符和操作数之间用空格分隔。 ######[AI写代码神器 | 887点数解答 | 2025-03-25 20:25:51]
- 递归下降语法分析程序实例:从文法到 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
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)240
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)264
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)261
- 求解 1 至 n 内第 k 大孤独数:质数与余数的巧妙探寻(字节豆包 | 298点数解答 | 2025-11-10 20:01:57)153
- 巧判小朋友同桌意愿:满足需求还是无解难题?(字节豆包 | 599点数解答 | 2025-11-16 20:06:12)67
- 巧用代码判断:能否让 2n 个小朋友都拥有满意同桌?(字节豆包 | 445点数解答 | 2025-11-16 20:07:02)78
- 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