用Java实现基本计算器

Leetcode_T227 基本计算器||(双栈解法)

给你一个字符串表达式 s ,s 由整数和算符 (+, -, *, /) 组成,中间由一些空格隔开

请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分

整体思路:用两个栈s1和s2,s1用于存储数据,s2用于存储运算符 s1存储数据时,注意对于两位数以上的数据,要循环读取数据 s2存储运算符,因为运算符有优先级,所以当遇到优先级低的,则先将栈内优先级高的运算符拿出与s1中的数据进行运算,并将运算结果返回s1中,再继续读取,就是先将优先级高的计算出结果,再继续进行其他运算 【注意】对于减法、除法,不要将被减数,被除数与减数、除数写反

代码实现:

import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

//基本计算器||
//运算优先级-双栈解决
public class Leetcode_T227 {
    public int calculate(String s) {
        int res = 0;
        s = s.replaceAll(" ", "");
        Deque<Integer> stack1 = new LinkedList<>();
        Deque<Character> stack2 = new LinkedList<>();
        Map<Character, Integer> map = new HashMap<>();
        map.put(+, 1);
        map.put(-, 1);
        map.put(*, 2);
        map.put(/, 2);
        int n = s.length();
        for (int i = 0; i < n; i++) {
//            如果是运算符
            if (map.containsKey(s.charAt(i))) {
//                借助栈,将优先级高的先进行运算
                while (!stack2.isEmpty() && map.get(s.charAt(i)) <= map.get(stack2.peek())) {
                    Character x = stack2.pop();
                    int a1 = stack1.pop();
                    int a2 = stack1.pop();
                    stack1.push(calculateMethod(a2, x, a1));
                }
                stack2.push(s.charAt(i));
            }
//            如果是数字
            else {
                int num = 0;
                int j = i;
//                循环读取两位数以上的数字
                while (j < n && Character.isDigit(s.charAt(j))) {
                    num = num * 10 + s.charAt(j) - 0;
                    j++;
                }
                stack1.push(num);
                i = j - 1;
            }
        }
//        当走完整个循环,如若stack2中还有运算符,继续算完
        while (!stack2.isEmpty()) {
            Character x = stack2.pop();
            int a1 = stack1.pop();
            int a2 = stack1.pop();
            stack1.push(calculateMethod(a2, x, a1));
        }
        return stack1.pop();
    }

    public int calculateMethod(int a, char b, int c) {
        switch (b) {
            case +:
                return a + c;
            case -:
                return a - c;
            case *:
                return a * c;
            case /:
                return a / c;
        }
        return -1;
    }
}
经验分享 程序员 微信小程序 职场和发展