基本计算器Ⅰ+Ⅱ

224.基本计算器

题目

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

示例 1:

输入:s = "1 + 1"
输出:2

示例 2:

输入:s = " 2-1 + 2 "
输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:

  • 1 <= s.length <= 3 * 105

  • s 由数字、'+''-''('')'、和 ' ' 组成

  • s 表示一个有效的表达式

    解:

    看到计算器,就想到了栈。

    1. 首先本题是一个包含+,- 和括号的简单计算

    2. 如果是没有括号的加减运算,可以将 5+4-5当成 5 + 4 +(-4),减号当符号处理,只有加法存在。

    3. 加上括号之后,括号内做单独的处理。 用栈存放好 括号前的符号和括号钱的数,括号结束,再计算 结果 (嵌套多个括号,依然如此入栈,遇到右括号再出栈)

      例如:

    (1-(4+5+2)-3)
    stack 先入栈括号前的数再入栈括号前的符号
    
resstack
10 1
40 1 1-1
110 1 1 -1
-10(-1 * 11+1)0 1
9
所以有代码:
class Solution {
    public int calculate(String s) {
        Stack<Integer> stack = new Stack<Integer>();
        // sign 代表正负
        int sign = 1, res = 0;
        int length = s.length();
        for (int i = 0; i < length; i++) {
            char ch = s.charAt(i);
            if (Character.isDigit(ch)) {
                int cur = ch - '0';
                  //把数字统计出来
                while (i + 1 < length && Character.isDigit(s.charAt(i + 1)))
                    cur = cur * 10 + s.charAt(++i) - '0';
                // 算到结果里
                res = res + sign * cur;
              
            } else if (ch == '+') {
                sign = 1;
            } else if (ch == '-') {
                sign = -1;
            } else if (ch == '(') {
                // 括号前数字入栈
                stack.push(res);
                res = 0;
                //括号前符号入栈
                stack.push(sign);
                sign = 1;
            } else if (ch == ')') {
                res = stack.pop() * res + stack.pop();  // 括号外的 符号* 括号内的数据 + 括号前的数字
            }
        }
        return res;
    }
}

基本计算器Ⅱ

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

输入:s = " 3+5 / 2 "
输出:5

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
    题目数据保证答案是一个 32-bit 整数

解:

本题是带有+,-,*,/ 的计算器,

  1. 先分析一个简单的计算:

    ​ (1).3+2*2-2/1 --> 3+4-2 可以简化为只带+,-的计算

    ​ (2).3+4-2 --> 3 + 4+(-4) 再简化为只带+的计算

  2. 那现在要做的就是如何简化

  3. 步骤:

    ​ (1). *,/ 的优先级是高于+,-的 先算乘除

    ​ (2). 遇到算符时无法处理计算,所以先存着,遇到下一个字符再处理上一个字符的运算。上一个字符是乘除就计算入栈,上一个字符是加减就加符号入栈

    ​ 3).最后全部数字出栈相加

class Solution {
    public int calculate(String s) {
         
	 
		 int cur = 0, res = 0;
	     int length = s.length();
	     char tab = '+'; //第一个字符是正
	     Stack<Integer> nums = new Stack<Integer>();
	     
	     for (int i = 0; i < length; i++) {
	    	   char ch = s.charAt(i);	
	    	 
	            if (ch!=' ' &&Character.isDigit(ch)) {
	            	//读取数字
	               cur = ch - '0';
	                while (i + 1 < length && Character.isDigit(s.charAt(i + 1)))
	                    cur = cur * 10 + s.charAt(++i) - '0';  
	            }
	            if( (ch < '0' && ch!=' ' )|| i==length-1)  //下一个符号判断上一个符号,或者是到了结尾
	            {
	            	//判断上一个符号	
	            	switch(tab) {
	            		case '+': nums.push(cur); break;
	            		case '-': nums.push(-cur);break;
	            		case '*': nums.push(nums.pop()*cur);break;
	            		case '/': nums.push(nums.pop()/cur);break;
	            		default : break;
	            	}
	            	 tab = ch;
	            	 cur = 0;
	            }        
	     }
	     //数字全部加起来
	     while(!nums.empty()) res += nums.pop(); 
	     return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值