227. 基本计算器 II
基本计算器
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = “3+2*2”
输出:7
栈
首先肯定是将字符串拆开,判断数字和加减乘除,数字需要从字符进行转化为数字,然后当遇到加法的时候,就把当前num添加到栈里面去,减法就是当前数的相反数,乘法和除法都需要将栈顶元素拿出来然后进行处理。最后需要计算栈内和。
步骤:
- 遍历字符串
- 判断数字,转换
- 加法,添加数字num,入栈
- 减法,添加数字相反数,入栈
- 乘法,栈顶元素和数字相乘,入栈
- 除法,栈顶元素和数字相除,入栈
- 栈求和
public int calculate(String s) {
Stack<Integer> stack = new Stack<>();
// 当前num值
int num = 0;
// 默认选择
char preSign = '+';
for(int i=0;i<s.length();i++){
// 判断字符是否是数字
if(Character.isDigit(s.charAt(i))){
// 转换为整数,多位字符进行拼接
num = num * 10 +s.charAt(i)-'0';
}
// 不是数字,空格,不是最后一个字符
if(!Character.isDigit(s.charAt(i)) && s.charAt(i) !=' ' || i==s.length()-1){
switch(preSign){
case '+':
// 添加
stack.push(num);
break;
case '-':
// 添加负数
stack.push(-num);
break;
case '*':
// 乘号去除栈顶元素和当前num相乘
stack.push(stack.pop()*num);
break;
case '/':
// 栈顶元素和当前num相除
stack.push(stack.pop()/num);
}
// 获取当前的字符,更新
preSign = s.charAt(i);
// num归0,重置
num=0;
}
}
// 计算之和
int ans = 0;
while(!stack.isEmpty()){
ans += stack.pop();
}
return ans;
}
时间复杂度:O(n)遍历了一次字符串,然后进行判断
空间复杂度:O(n)栈内元素取出来进行相加
总结:这一题一开始没考虑到有多位数的情况,以及相应的字符判断是否为数字的方法不知道如何判断。