[LC] 224. Basic Calculator

本文介绍了一种不使用内置eval函数实现基本计算器的方法,通过解析简单的数学表达式字符串并进行计算。文章详细讨论了如何利用栈来处理括号,并给出了具体的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

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


二、我的思路

想到在出现括号时用栈,但不知道java的栈怎么写……另外具体的边界条件也没想清楚。借鉴了discuss里的思路以后,写了代码

class Solution {
    public int calculate(String s) {
        char[] c = s.toCharArray();
        Stack<Integer> stack = new Stack<Integer>();
        
        int result = 0;
        int sign = 1;
        
        for(int i = 0; i < c.length; i ++){
            switch(c[i]){
                case '(':
                    stack.push(sign);
                    stack.push(result);
                    result = 0;
                    sign = 1;
                    break;
                case ')':
                    result = stack.pop() + stack.pop()*result;
                    break;
                case '+':
                    sign = 1;
                    break;
                case '-':
                    sign = -1;
                    break;
                case ' ':
                    break;  
                default:
                    if(Character.isDigit(c[i])){
                        int sum = c[i] - '0';
                        while(i + 1 <= c.length -1 && Character.isDigit(c[i+1])){	// Mind the condition!!!
                            sum = sum*10 + c[i + 1] - '0';
                            i ++;
                        }
                        result += sign * sum;
                    }
                    break;
            }
        }
        return result; 
    }
}
注意while的条件,以及sign和result什么时候复原。

三、淫奇技巧

思路都差不多,就是对五种字符分别处理,不同的是number的处理更优美了。

public int calculate(String s) {
    Stack<Integer> stack = new Stack<Integer>();
    int result = 0;
    int number = 0;
    int sign = 1;
    for(int i = 0; i < s.length(); i++){
        char c = s.charAt(i);
        if(Character.isDigit(c)){
            number = 10 * number + (int)(c - '0');
        }else if(c == '+'){
            result += sign * number;
            number = 0;
            sign = 1;
        }else if(c == '-'){
            result += sign * number;
            number = 0;
            sign = -1;
        }else if(c == '('){
            //we push the result first, then sign;
            stack.push(result);
            stack.push(sign);
            //reset the sign and result for the value in the parenthesis
            sign = 1;   
            result = 0;
        }else if(c == ')'){
            result += sign * number;  
            number = 0;
            result *= stack.pop();    //stack.pop() is the sign before the parenthesis
            result += stack.pop();   //stack.pop() now is the result calculated before the parenthesis
            
        }
    }
    if(number != 0) result += sign * number;
    return result;
}


四、不足

很多java的工具根本不知道……

Java Character:http://www.runoob.com/java/java-character.html


五、碎碎念

后天上午就要面试了,加油吖~

### com.android.calculator2 开发文档、源码解析及常见问题解决方案 #### 一、开发文档概述 对于`com.android.calculator2`而言,官方并没有提供专门针对此包名下的计算器应用独立详细的开发文档。然而,在AOSP(Android Open Source Project)网站上可以找到关于如何构建和贡献代码到整个Android平台的相关指南[^1]。 #### 二、源码结构分析 该应用程序位于`packages/apps/Calculator`路径下。其主要组成部分如下: - `res/values`: 存储字符串资源和其他配置信息; - `AndroidManifest.xml`: 定义组件声明及其权限需求; 通过研究这些部分能够深入了解程序的工作原理并为其添加新特性或修复漏洞打下基础[^2]。 ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.calculator2"> </manifest> ``` #### 三、常见问题处理方案 ##### 1. 应用闪退 如果遇到启动即崩溃的情况,则可能是由于第三方ROM定制过程中引入了不兼容更改所引起。此时建议开发者先确认当前使用的SDK版本是否匹配,并仔细检查是否存在未捕获异常日志输出以便定位具体错误位置。 ##### 2. 计算结果偏差 当发现计算精度存在问题时,应重点审查数值转换算法以及浮点数运算方式的选择合理性。此外还需注意不同设备间处理器架构差异可能导致相同操作得到略微不同的近似解这一现象。 ##### 3. UI布局适配不良 为了确保界面能够在多种屏幕尺寸上良好显示,应当遵循Material Design设计原则来调整控件大小比例关系,并利用ConstraintLayout等现代布局管理器提高灵活性。同时也要测试低分辨率模式下的表现情况以覆盖更多潜在用户群体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值