当前位置:   article > 正文

【学习】C++中缀表达式转后缀表达式(逆波兰式)【有代码】

c++中缀表达式转后缀表达式

方法一:括号法(直接获得结果)

1、在运算符的两边加上括号

2、把符号移动到符号所在括号后边

3、去除所有括号

例:8*(3-1)—2/5

1、((8*(3-1))-(2/5))

2、((8(31)-)*(25)/)-

3、8 3 1 - * 2 5 / -

 【2分钟秒杀-中缀表达式转前后缀表达式】 https://www.bilibili.com/video/BV1aV4y1771G/?share_source=copy_web&vd_source=d04bc972ba0b1aff78f14b3cdc972a6c

 方法二:栈的应用

例:8*(3-1)-2/5

步骤(遍历字符串后进行判断)

1、数字直接加入逆波兰字符串 

 

 2、获得运算符时,判断栈不为空 且优先级不小于栈顶元素,就出栈,否则入栈

 

此时栈顶元素优先级高于当前元素,因此先出栈再入栈

3、左括号直接加入符号字符串

4、遇到右括号时,判断栈不为空并且栈顶不是(时,把符号放入逆波兰容器,同时出栈,遇到(,再把(出栈 

 5、当所有的中序表达式遍历完后,在栈内的符号依次出栈

 

6、拼接结果字符串

函数代码

  1. #include <iostream>
  2. #include <stack>
  3. #include <vector>
  4. #include <string>
  5. #include <cctype>
  6. using namespace std;
  7. //中缀表达式 3 + 2 * 2
  8. //后缀表达式 3 2 2 * +
  9. bool isOperator(char ch) {
  10. return ch == '+' || ch == '-' || ch == '*'|| ch == '/';
  11. }
  12. int precedence(char op) {
  13. if (op == '+' || op == '-')return 1;
  14. if (op == '*' || op == '/')return 2;
  15. return 0;
  16. }
  17. //将中缀表达式转换为逆波兰表达式
  18. /*
  19. 1、数字直接加入逆波兰字符串
  20. 2、左括号直接加入符号字符串
  21. 3、遇到右括号时,判断栈不为空并且栈顶不是(时,把符号放入逆波兰容器,同时出栈,遇到(,再把(出栈
  22. 4、获得运算符时,判断栈不为空 且优先级不小于栈顶元素,就出栈,否则入栈
  23. 5、当所有的中序表达式遍历完后,在栈内的符号依次出栈
  24. 6、拼接结果字符串
  25. */
  26. string infixToPostfix(const string& infix) {
  27. stack<char>ops;
  28. vector<char> postfix;
  29. for (char ch : infix)
  30. {
  31. if (isspace(ch))continue;
  32. if (isdigit(ch))
  33. {
  34. postfix.push_back(ch);
  35. }
  36. else if (ch =='(')
  37. {
  38. ops.push(ch);
  39. }
  40. else if (ch==')')
  41. {
  42. while (!ops.empty() && ops.top()!='(')
  43. {
  44. postfix.push_back(ops.top());
  45. ops.pop();
  46. }
  47. //弹出‘(’
  48. if (!ops.empty())
  49. {
  50. ops.pop();
  51. }
  52. }
  53. else if (isOperator(ch))
  54. {
  55. while (!ops.empty() && precedence(ops.top()) >= precedence(ch))
  56. {
  57. postfix.push_back(ops.top());
  58. ops.pop();
  59. }
  60. //栈为空或者优先级底就直接加入
  61. ops.push(ch);
  62. }
  63. }
  64. while (!ops.empty())
  65. {
  66. postfix.push_back(ops.top());
  67. ops.pop();
  68. }
  69. string result;
  70. for (char ch : postfix) {
  71. result += ch;
  72. }
  73. return result;
  74. }
  75. int main() {
  76. string infix = "8*(3-1)-2/5";
  77. string postfix = infixToPostfix(infix);
  78. cout << "Postfix expreesion:" << postfix << endl;
  79. return 0;
  80. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/611454
推荐阅读
相关标签
  

闽ICP备14008679号