用Java实现基本计算器

该博客介绍了一种利用两个栈解决LeetCode 227题的方法,即基本计算器II。通过一个栈存储数字,另一个栈存储运算符,遵循运算符的优先级进行计算。在遍历输入字符串时,遇到数字则存入栈1,遇到运算符则根据优先级从栈2弹出运算符并与栈1中的数字进行计算。最后,确保所有运算完成后返回结果。此方法有效地处理了加减乘除和两位数以上的数字情况。
摘要由CSDN通过智能技术生成

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

227. 基本计算器 II - 力扣(LeetCode) (leetcode-cn.com)

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

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

整体思路:用两个栈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;
    }
}

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨笨在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值