最全中缀,前缀,后缀相互转换总结

①中缀前缀后缀相互转换总结表
在这里插入图片描述②常用的运算符优先级
在这里插入图片描述

C++中,我们可以使用栈数据结构来实现表达式的前缀中缀后缀之间的转换。这里给出简单的代码示例: **前缀后缀转换(Shunting Yard算法):** ```cpp #include <iostream> #include <stack> #include <string> #include <cctype> std::string prefixToPostfix(const std::string& prefix) { std::stack<char> opStack; std::string postfix = ""; for (char c : prefix) { if (isdigit(c)) { postfix += c; // 直接添加数字 } else if (c == '(' || isalpha(c)) { // 遇到操作符或左括号,压入堆栈 opStack.push(c); } else if (c == ')') { // 遇到右括号,弹出并添加直到遇到左括号 while (!opStack.empty() && opStack.top() != '(') { postfix += opStack.top(); opStack.pop(); } if (!opStack.empty()) { opStack.pop(); // 弹出左括号 } } else { // 遇到运算符,处理优先级较高的先入栈 while (!opStack.empty() && precedence(c) <= precedence(opStack.top())) { postfix += opStack.top(); opStack.pop(); } opStack.push(c); } } // 最后将剩余的操作符加入后缀表达式 while (!opStack.empty()) { postfix += opStack.top(); opStack.pop(); } return postfix; } // 运算符优先级函数,可以根据实际需求调整 int precedence(char op) { switch (op) { case '+': case '-': case '*': case '/': return 1; default: return 0; } } int main() { std::string prefixExpr = "3+5*2-1"; std::string postfixExpr = prefixToPostfix(prefixExpr); std::cout << "Prefix to Postfix: " << postfixExpr << "\n"; return 0; } ``` **后缀前缀转换:** ```cpp bool isOperator(const char& ch) { return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); } std::string postfixToPrefix(const std::string& postfix) { std::stack<std::pair<char, int>> stack; for (char c : postfix) { if (isdigit(c)) { stack.push({c - '0', 1}); // 保持数字不变 } else if (isOperator(c)) { while (!stack.empty() && !isOperator(stack.top().first) && precedence(stack.top().first) >= precedence(c)) { postfix.insert(postfix.begin(), stack.top().first); stack.pop(); } stack.push({c, 1}); } else if (c == '(') { stack.push({c, 0}); } else if (c == ')') { while (stack.top().second != 0) { postfix.insert(postfix.begin(), stack.top().first); stack.pop(); } stack.pop(); // 弹出左括号 } } while (!stack.empty()) { postfix.insert(postfix.begin(), stack.top().first); stack.pop(); } return postfix; } int main() { std::string postfixExpr = "34+56*2-1/"; std::string prefixExpr = postfixToPrefix(postfixExpr); std::cout << "Postfix to Prefix: " << prefixExpr << "\n"; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值