一、题目描述
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 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 + 3)"
无效) - '-' 可以用作一元运算(即 "-1" 和
"-(2 + 3)"
是有效的) - 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位 整数
二、思路分析
三、代码参考
1、Java
class Solution {public int calculate(String s) {// 创建栈空间Stack<Integer> stack = new Stack<>();// 用来表示正负号,1 为 + , -1 位 - ,默认为正数int sign = 1;// 用来记录运算结果int result = 0;// 循环遍历字符串for(int i = 0; i < s.length(); i++){// 获取当前字符char str = s.charAt(i); // 判断是否为数字类型if(Character.isDigit(str)){// 通过 - '0' 这个操作把字符转换为整数int value = str - '0';// 查看后面是否字符仍为数字,即数字是否为多位数,如果是需要拼接好数字while(i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))){// i 向后移动i++;// 数字拼接,如// 12 = 1 * 10 + 2// 123 = 12 * 10 + 3value = value * 10 + s.charAt(i) - '0';}// 把获取到的结果赋值给 resultresult = result + sign * value;} // 如果是 + 符号,则 sign 为 1else if(str == '+'){sign = 1;}// 如果是 - 符号,则 sign 为 -1else if(str == '-'){sign = -1;}// 判断是否是 '('else if(str == '('){// 先把在遇到 '(' 之前的结果放入到栈中stack.push(result);// 然后 result 结果置空,为了等下计算括号里面的结果result = 0;// 再把左括号前面的符号放入到栈中stack.push(sign);// 回归默认值sign = 1;}// 判断是否为 ')'else if(str == ')'){// 取出栈顶的元素,此时的栈顶元素是 '(' 前的符号int symbol = stack.pop();// 再获取栈顶元素,此时的栈顶元素是 '(' 前的运算结果int stackResult = stack.pop();// 计算结果并将结果赋值给 resultresult = stackResult + symbol * result;}}// 返回结果return result;}
}
2、Python
class Solution(object):def calculate(self, s):# 创建栈空间stack = list()# 用来表示正负号,1 为 + , -1 位 - ,默认为正数sign = 1# 用来记录运算结果result = 0# 初始化 i i = 0# 循环遍历字符串while i < len(s):# 获取当前字符str = s[i]# ' ' 空字符不需要做处理,下一个就好if str == ' ' :i += 1# 判断是否为数字类型elif str.isdigit() :# 把字符类型转换成数字类型value = ord(s[i]) - ord('0')# 查看后面是否字符仍为数字,即数字是否为多位数,如果是需要拼接好数字while i + 1 < len(s) and s[i + 1].isdigit():# i 向后移动i += 1# 数字拼接,如# 12 = 1 * 10 + 2# 123 = 12 * 10 + 3value = value * 10 + ord(s[i]) - ord('0')# 把获取到的结果赋值给 resultresult += value * signi += 1# 如果是 + 符号,则 sign 为 1elif str == '+' :sign = 1i += 1# 如果是 - 符号,则 sign 为 -1elif str == '-' :sign = -1i += 1# 判断是否是 '('elif str == '(' :# 先把在遇到 '(' 之前的结果放入到栈中stack.append(result)# 然后 result 结果置空,为了等下计算括号里面的结果result = 0# 再把左括号前面的符号放入到栈中stack.append(sign)# 回归默认值sign = 1i += 1# 判断是否为 ')'elif str == ')' :# 取出栈顶的元素,此时的栈顶元素是 '(' 前的符号symbol = stack.pop()# 再获取栈顶元素,此时的栈顶元素是 '(' 前的运算结果stackResult = stack.pop()# 计算结果并将结果赋值给 resultresult = stackResult + symbol * result i += 1# 返回结果return result