当前位置:   article > 正文

咸鱼学数据结构与算法——中缀表达式转前缀表达式

中缀表达式转前缀表达式

目录

一、中缀表达式转前缀表达式算法介绍

二、中缀表达式转前缀表达式代码实现


一、中缀表达式转前缀表达式算法介绍

  1. (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
  2. (2) 从右至左扫描中缀表达式;
  3. (3) 遇到操作数时,将其压入S2;
  4. (4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
  5. (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
  6. (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
  7. (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
  8. (5) 遇到括号时:
  9. (5-1) 如果是右括号“)”,则直接压入S1;
  10. (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
  11. (6) 重复步骤(2)至(5),直到表达式的最左边;
  12. (7) 将S1中剩余的运算符依次弹出并压入S2;
  13. (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

二、中缀表达式转前缀表达式代码实现

  1. //infixExperssion为中缀表达式
  2. public static List<String> InfixToPrefix(String infixExperssion){
  3. // 从右向左扫描
  4. int index=infixExperssion.length()-1;
  5. // 用来存放前缀表达式
  6. List<String> resultList=new ArrayList<String>();
  7. // 用来存放运算符
  8. Stack<String> operStack=new Stack<String>();
  9. // 用来拼接数字,多位数字
  10. String joint="";
  11. while (true){
  12. // 当扫描完毕后,退出循环
  13. if(index<0){
  14. break;
  15. }
  16. // 如果扫描到是操作数,直接将结果加入到结果list中
  17. // 如果是多位数的问题已经解决
  18. if (isNum(infixExperssion.charAt(index))){
  19. // 由于是从右向左扫描,所以拼接要从右侧开始拼接
  20. joint=infixExperssion.charAt(index)+joint;
  21. // 判断是否越界,如果越界则不需要比较
  22. if(index>1){
  23. // 判断下一个字符是否为数字
  24. if(!isNum(infixExperssion.charAt(index-1))){
  25. resultList.add(joint);
  26. joint="";
  27. // 执行完成后让index加一,不然会陷入死循环
  28. index--;
  29. }else {
  30. index--;
  31. }
  32. // 已经是最后一位数了,不需要看下一位了
  33. }else {
  34. resultList.add(joint);
  35. joint="";
  36. index--;
  37. }
  38. // 如果是运算符,根据运算符优先级判断运算符是否进入运算符栈
  39. }else if(isOper(infixExperssion.charAt(index))){
  40. char oper=infixExperssion.charAt(index);
  41. // 如果为空,则直接加入到运算符中
  42. if (operStack.empty()){
  43. operStack.push(String.valueOf(oper));
  44. index--;
  45. // 如果优先级大于运算符栈顶运算符的优先级,将运算符加入到运算符栈中
  46. }else if(Priority(oper)>Priority(operStack.peek().charAt(0))){
  47. operStack.push(String.valueOf(oper));
  48. index--;
  49. // 将运算符栈栈顶的运算符加入到List数组中
  50. }else {
  51. resultList.add(operStack.pop());
  52. // index++;
  53. }
  54. // 如果是右括号,将右括号放入运算符栈中
  55. }else if(infixExperssion.charAt(index)==')'){
  56. operStack.push(String.valueOf(infixExperssion.charAt(index)));
  57. index--;
  58. // 根据右括号来去除左括号
  59. } else if(infixExperssion.charAt(index)=='('){
  60. while (!operStack.empty()&&!operStack.peek().equals(")")){
  61. resultList.add(operStack.pop());
  62. }
  63. // 丢弃右括号
  64. operStack.pop();
  65. index--;
  66. }
  67. }
  68. // 将运算符栈中的运算符弹到list中
  69. while (!operStack.empty()){
  70. resultList.add(operStack.pop());
  71. }
  72. // 将结果反转
  73. Collections.reverse(resultList);
  74. return resultList;
  75. }
  76. //比较优先级
  77. public static int Priority(char ch){
  78. if (ch=='+'||ch=='-'){
  79. return 1;
  80. }else if (ch=='*'||ch=='/'){
  81. return 2;
  82. }else {
  83. return 0;
  84. }
  85. }
  86. //判断是否为运算符
  87. public static boolean isOper(char oper){
  88. if(oper=='+'||oper=='-'||oper=='*'||oper=='/'){
  89. return true;
  90. }else {
  91. return false;
  92. }
  93. }
  94. //判断是否为数字
  95. public static boolean isNum(char num){
  96. if(num>=48&&num<=57){
  97. return true;
  98. }else {
  99. return false;
  100. }
  101. }

 

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

闽ICP备14008679号