栈实现基本计算器

leetcode题目链接

这题其实和逆波兰表达式很像,无非多了个(和)

我们可以定义三个变量。

result表示当前计算结果

sign表示是+还是-

number表示当前数字

遍历字符串

利用isDigit 方法 提出数字

如果遇到加号result+=sign*number

减号则将sign=-1;

如果遇到(则先将当前的result和sign存入栈内

当遇到)在弹出

要主要的是末尾字符如果是数字且不为0一定记得加上。

代码如下:

import java.util.Stack;

// 给你一个字符串s,请你实现一个基本计算器来计算返回它的值
// 注意不允许使用任何字符串作为字符串作为数学表达式计算的内置函数,比如eval
public class calculate {
    public int calculate(String s){
       // rsult 当前计算结果
        // number当前正在处理的数字
        // sign当前符号 1表示正 -1表示负
        Stack<Integer>stack =new Stack<>();
        int result = 0;
        int sign = 1;
        int number = 0;
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(Character.isDigit(c)){
                number=number*10+c-'0';
            }
            else if(c=='+'){
                result=result+sign*number;
                number=0;
                sign=1;
            }
            else if(c=='-'){
                result=result+sign*number;
                number=0;
                sign=-1;
            }
            else if(c=='('){
                stack.push(result);
                stack.push(sign);
                result=0;
                sign=1;
            }
            else if(c==')') {
                result = result + sign * number;
                number = 0;
                result *= stack.pop();//弹出并应用括号前的符号
                result += stack.pop();// 加上括号前的计算结果

            }
        }
        if(number!=0){
            result = result + sign * number;
        }
        return result;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

翔山代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值