227. Basic Calculator II

本文介绍了一种简易计算器的设计与实现,该计算器能解析并计算简单的数学表达式,支持加、减、乘、除四种基本运算,并确保整数除法向零截断。文中详细解释了如何逐字符扫描输入字符串,提取数字并进行相应的四则运算。
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

Note: Do not use the eval built-in library function.

以下是solution:

public int calculate(String s) {
    int len;
    if(s==null || (len = s.length())==0) return 0;
    Stack<Integer> stack = new Stack<Integer>();
    int num = 0;
    char sign = '+';
    for(int i=0;i<len;i++){
        //1.
        if(Character.isDigit(s.charAt(i))){
            num = num*10+s.charAt(i)-'0';
        }
        if((!Character.isDigit(s.charAt(i)) &&' '!=s.charAt(i)) || i==len-1){
            //2.
            if(sign=='-'){
                stack.push(-num);
            }
            if(sign=='+'){
                stack.push(num);
            }
            if(sign=='*'){
                stack.push(stack.pop()*num);
            }
            if(sign=='/'){
                stack.push(stack.pop()/num);
            }
            sign = s.charAt(i);
            num = 0;
        }
    }

    int re = 0;
    for(int i:stack){
        re += i;
    }
    return re;
}

相比自己写的代码 主要有几点优化
1.获取表达式中的数字 
比如输入是 “2333+666"
我是这样做 从头开始找 找到第一个数字的作为start 也就是2 接下来向后找到第一个不是数字的 也就是+
那么在[2,+)之间 就是一个数字 也就是2333
solution是这样做 也是从开始找 只要找到一个数字 那么就num = num*10 + 当前数字
过程是这样
2
2*10+3
(2*10+3)*10 + 3
代码看起来比较简洁 也避免了用Integer.parseInt去转化
2.四则远算
我分了两步 遇到运算符 判断是不是高优先级的 也就是*和/ 如果是就直接运算 如果不是那么数字和运算符分别push进stack 等待后续运算
通过这样 乘除法优先运算 最后只剩下加减法
solution也是两步
判断运算符 如果是乘除 直接用上一个数字和当前数字运算 放入stack 如果是加减连带符号push进stack 变为正负数
最后 只要把stack中的元素sum就可以了 不区分加减法 看起来很清晰
算是一种对于运算的抽象吧 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值