栈的应用-中序表达式转后序表达式

  
  
  1. /**
  2. * 波兰表达式;输入中序表达式-》导出后序表达式 -》根据后序表达式求出算式结果
  3. *
  4. * @author timmy1
  5. *
  6. */
  7. public class PolishExpression {
  8. /**
  9. * 中序转后序表达式规则:数字直接输入-运算符入栈,如果栈顶的运算符比要入栈的运算符优先级高的话,出栈-遇到右括号,则栈顶元素出栈,一直到左括号
  10. *
  11. * @param str
  12. */
  13. private MyStack<String> expressionMiddleToAfter(String str) {
  14. String[] strArr = str.split(" ");
  15. MyStack<String> tempStack = new MyStack<>();// 中间转换的栈,进行入栈,出栈操作,
  16. MyStack<String> resultStack = new MyStack<>();// 结果栈
  17. for (int i = 0; i < strArr.length; i++) {
  18. String data = strArr[i];
  19. if (!isOperator(data)) {
  20. // 不是运算符->数字-》直接输出-》入结果栈
  21. resultStack.push(data);
  22. continue;
  23. } else {// 是运算符
  24. // 1.如果转换栈为空,直接入栈
  25. if (tempStack.size() == 0 || data.equals("(")) {
  26. tempStack.push(data);
  27. continue;
  28. }else if (data.equals(")")) {// 中间栈不为空,且元素为由括号,则先判断中间栈是否有左括号-》有的话,需要出栈知道左括号出栈
  29. int index = tempStack.search("(");
  30. if (index == -1) {
  31. // 没有左括号-》抛出异常
  32. throw new IllegalArgumentException("栈中未找到左括号");
  33. }
  34. // 找到左括号,出栈
  35. for (int j = tempStack.size() - 1; j > index; j--) {
  36. // 获取栈顶元素->添加到结果栈
  37. String peekData = tempStack.peek();
  38. resultStack.push(peekData);
  39. tempStack.pop();
  40. }
  41. // 将左括号出中间转换栈
  42. tempStack.pop();
  43. continue;
  44. } else {
  45. // 接下来的情况就是 + - * / 和(
  46. if (isHigherPriorLevel(data, tempStack)) {
  47. // 入栈元素运算符优先级高于中间栈栈顶元素优先级-》直接入栈中间栈
  48. tempStack.push(data);
  49. }else{
  50. // 比栈顶优先级低的话,中间栈元素全部出栈,
  51. while (tempStack.size() != 0) {
  52. resultStack.push(tempStack.peek());
  53. tempStack.pop();
  54. }
  55. tempStack.push(data);
  56. }
  57. }
  58. }
  59. }
  60. while (tempStack.size() != 0) {
  61. resultStack.push(tempStack.peek());
  62. tempStack.pop();
  63. }
  64. return resultStack;
  65. }
  66. /**
  67. * 当前运算符优先级是否高于中间转换栈的栈顶元素的优先级
  68. *
  69. * @param data
  70. * @param tempStack
  71. * @return
  72. */
  73. private boolean isHigherPriorLevel(String data, MyStack<String> tempStack) {
  74. if(tempStack.peek().equals("(")){
  75. return true;
  76. }
  77. if (data.equals("*") || data.equals("/") && tempStack.peek().equals("+") || tempStack.peek().equals("-")) {
  78. return true;
  79. }
  80. return false;
  81. }
  82. // 判断是否是运算符
  83. private static boolean isOperator(String string) {
  84. String[] operators = { "(", ")", "+", "-", "*", "/" };
  85. for (int i = 0; i < operators.length; i++) {
  86. if (string.equals(operators[i])) {
  87. return true;
  88. }
  89. }
  90. return false;
  91. }
  92. public static void main(String[] args) {
  93. PolishExpression pExpression = new PolishExpression();
  94. String str = "3 + ( 3 - 1 ) * 3 - 10 / 2";
  95. PrintUtil.print("中序表达式为:" + str);
  96. MyStack<String> resultStack = pExpression.expressionMiddleToAfter(str);
  97. String[] resultStr = pExpression.printStackByBottom(resultStack);
  98. int result = calculate(resultStr);
  99. PrintUtil.print("最后结果为: "+result);
  100. }
  101. private static int calculate(String[] resultStr) {
  102. MyStack<String> stack = new MyStack<>();
  103. for(int i = 0;i<resultStr.length;i++){
  104. String data = resultStr[i];
  105. if(!isOperator(data)){
  106. //数字入栈
  107. stack.push(data);
  108. }else{
  109. //获取到运算符前面的两个元素,-》进行计算后-》结果入栈
  110. String num1 = stack.peek();
  111. stack.pop();
  112. String num2 = stack.peek();
  113. stack.pop();
  114. int res = calc(num2,data,num1);
  115. stack.push(res+"");
  116. }
  117. }
  118. String retRes = stack.peek();
  119. stack.pop();
  120. return Integer.valueOf(retRes);
  121. }
  122. private static int calc(String num1, String data, String num2) {
  123. int num11 = Integer.valueOf(num1);
  124. int num22 = Integer.valueOf(num2);
  125. if(data.equals("+")){
  126. return num11+num22;
  127. }else if(data.equals("-")){
  128. return num11-num22;
  129. }else if(data.equals("*")){
  130. return num11*num22;
  131. }else if(data.equals("/")){
  132. return num11/num22;
  133. }
  134. return -1;
  135. }
  136. // 栈元素打印,从栈低开始打印
  137. private String[] printStackByBottom(MyStack<String> stack) {
  138. String[] str = new String[stack.size()];
  139. int index = 0;
  140. while (stack.size() != 0) {
  141. str[index++] = stack.peek();
  142. stack.pop();
  143. }
  144. // 反转
  145. for (int i = 0; i < str.length / 2; i++) {
  146. String temp = str[i];
  147. str[i] = str[str.length - 1 - i];
  148. str[str.length - 1 - i] = temp;
  149. }
  150. PrintUtil.printArray(str);
  151. return str;
  152. }
  153. }
   
   
  1. public class PrintUtil {
  2. public static final int HORIZONTAL = 0;
  3. public static void print(String str) {
  4. System.out.println(str);
  5. }
  6. public static void printArray(int[] array, int confi) {
  7. if (confi == HORIZONTAL) {
  8. printHorizonal(array);
  9. } else {
  10. printArray(array);
  11. }
  12. }
  13. private static void printHorizonal(int[] array) {
  14. for (int i = 0; i < array.length; i++) {
  15. System.out.print(array[i] + ", ");
  16. }
  17. System.out.println("");
  18. }
  19. public static void printArray(int[] a) {
  20. for (int i = 0; i < a.length; i++) {
  21. print("元素" + (i + 1) + ":" + a[i]);
  22. }
  23. }
  24. public static void printArray(String[] str) {
  25. for (int i = 0; i < str.length; i++) {
  26. System.out.print(str[i] + ", ");
  27. }
  28. System.out.println("");
  29. }
  30. }

结果打印:

中序表达式为:3 + ( 3 - 1 ) * 3 - 10 / 2

3, 3, 1, -, 3, *, +, 10, 2, /, -, 

最后结果为: 4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值