Java栈实现简单的数学表达式的运算

 1 import java.util.Stack;
 2 
 3 /**
 4  * 栈实现数学表达式的运算
 5  *
 6  * @athor: Deters
 7  * @date: 2019/9/11 11:32
 8  */
 9 public class Transfer {
10     public static void main(String[] args) {
11         String expression = "(2*(1+3)+8)/4";
12         Stack<Character> characterStack = new Stack<>();
13         Stack<Integer> integerStack = new Stack<>();
14         // 1.拆分字符串
15         char[] arr = expression.toCharArray();
16         // 2.将拆分好的字符依次放入两个栈中
17         int result = setStackDate(arr, characterStack, integerStack);
18 
19         System.out.println(expression + "=" + result);
20     }
21 
22     /**
23      * 将拆分好的字符依次放入两个栈中
24      *
25      * @param arr            需要运算的字符
26      * @param characterStack 符号运算符
27      * @param integerStack   数字运算符
28      */
29     private static int setStackDate(char[] arr, Stack<Character> characterStack, Stack<Integer> integerStack) {
30 
31         for (int i = 0; i < arr.length; i++) {
32             if (arr[i] == '(') {
33                 continue;
34             }
35             if (arr[i] == ')') {
36                 // 3.根据规则,弹栈并运算
37                 calculate(characterStack, integerStack);
38                 continue;
39             }
40             // 如果是数字
41             if ('0' <= arr[i] && arr[i] <= '9') {
42                 integerStack.push(Integer.valueOf(String.valueOf(arr[i])));
43             } else {
44                 // 如果是运算符
45                 characterStack.push(arr[i]);
46             }
47         }
48         // 将栈中,最后的结果算出
49         Integer num1 = integerStack.pop();
50         Integer num2 = integerStack.pop();
51         integerStack.push(num2);
52         integerStack.push(num1);
53         return calculate(characterStack, integerStack);
54     }
55 
56     /**
57      * 根据规则进行计算
58      * <p>
59      * 规则:
60      * (2*(1+3)+8)/4
61      * integerStack弹出两位,与characterStack弹出的一位运算符进行计算,并把结果压回到integerStack,直到characterStack为空
62      *
63      * @param characterStack 字符栈
64      * @param integerStack   数字栈
65      */
66     private static int calculate(Stack<Character> characterStack, Stack<Integer> integerStack) {
67         Integer sum = 0;
68         while (!characterStack.empty()) {
69             Integer num1 = integerStack.pop();
70             Integer num2 = integerStack.pop();
71             Character operator = characterStack.pop();
72             if (operator == '+') {
73                 sum = num2 + num1;
74             } else if (operator == '-') {
75                 sum = num2 - num1;
76             } else if (operator == '*') {
77                 sum = num2 * num1;
78             } else if (operator == '/') {
79                 sum = num2 / num1;
80             }
81             integerStack.push(sum);
82         }
83         return sum;
84     }
85 }

 

转载于:https://www.cnblogs.com/Deters/p/11505967.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值