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
表示一个有效的表达式解:
看到计算器,就想到了栈。
-
首先本题是一个包含+,- 和括号的简单计算
-
如果是没有括号的加减运算,可以将 5+4-5当成 5 + 4 +(-4),减号当符号处理,只有加法存在。
-
加上括号之后,括号内做单独的处理。 用栈存放好 括号前的符号和括号钱的数,括号结束,再计算 结果 (嵌套多个括号,依然如此入栈,遇到右括号再出栈)
例如:
(1-(4+5+2)-3) stack 先入栈括号前的数再入栈括号前的符号
-
res | stack |
---|---|
1 | 0 1 |
4 | 0 1 1-1 |
11 | 0 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).3+2*2-2/1 --> 3+4-2 可以简化为只带+,-的计算
(2).3+4-2 --> 3 + 4+(-4) 再简化为只带+的计算
-
那现在要做的就是如何简化
-
步骤:
(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;
}
}