image.png

    1. package com.atguigu.stack;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. import java.util.Stack;
    5. /**
    6. * @author Dxkstart
    7. * @create 2021-10-08-19:49
    8. */
    9. public class PolandNotation {
    10. public static void main(String[] args) {
    11. //先定义一个逆波兰表达式
    12. //(3+4)*5-6 => 3 4 + 5 * 6 -
    13. String suffixExpression = "3 4 + 5 * 6 -";
    14. //思路
    15. //1.先将 "3 4 + 5 * 6 -" => 放到ArrayList中
    16. //2.将ArrayList传递给一个方法,遍历ArrayList配合栈完成计算
    17. List<String> rpnList = getListString(suffixExpression);
    18. System.out.println("计算结果为:" + calculate(rpnList));
    19. }
    20. //将一个逆波兰表达式,依次将数据和运算符放入到ArrayList中
    21. public static List<String> getListString(String suffixExpression) {
    22. //将sufferExpression 分割
    23. String[] split = suffixExpression.split(" ");
    24. List<String> list = new ArrayList<>();
    25. for (String str : split) {
    26. list.add(str);
    27. }
    28. return list;
    29. }
    30. //完成对逆波兰表达式的运算
    31. /*
    32. 1.从左至右扫描,将3和4压入堆栈
    33. 2.遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈
    34. 3.将5入栈
    35. 4.接下来是×运算符,因此弹出5和7,计算出7*5=35,将35入栈
    36. 5.将6入栈
    37. 6.最后是-运算符,计算出35-6的值,即29,由此得出最终结果
    38. */
    39. public static int calculate(List<String> ls) {
    40. int val;
    41. int num2;
    42. int num1;
    43. //创建一个栈,只需要一个就可以
    44. Stack<String> stack = new Stack<>();
    45. //遍历ls
    46. for (String item : ls) {
    47. //这里用正则表达式来判断取出来的是数字还是符号
    48. if (item.matches("\\d+")) { //匹配的是多位数
    49. //入栈
    50. stack.push(item);
    51. } else {
    52. //pop出两个数,并运算,再将结果入栈
    53. num2 = Integer.parseInt(stack.pop());
    54. num1 = Integer.parseInt(stack.pop());
    55. if (item.equals("+")) {
    56. val = num1 + num2;
    57. } else if (item.equals("-")) {
    58. val = num1 - num2;
    59. } else if (item.equals("*")) {
    60. val = num1 * num2;
    61. } else if (item.equals("/")) {
    62. val = num1 / num2;
    63. } else {
    64. throw new RuntimeException("运算符有误!");
    65. }
    66. //把val入栈
    67. stack.push(Integer.toString(val));
    68. }
    69. }
    70. return Integer.parseInt(stack.pop());
    71. }
    72. }