实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
本题和https://www.jianshu.com/p/3975859c1539
是很像的,区别就在于一个是有括号一个是没括号,一个是有乘除法一个是没乘除法。那我们就要抓住两道题的类似的地方来寻求一个通解。
有括号那就要先做括号的,那有乘除的,由于只有加减乘除没有括号,因此一旦出现乘除就一定要把值给算出来,而如果是加减法的话,由于不确定之后是否有乘除法,那只能先将值给存储起来,而通过之前的例子https://www.jianshu.com/p/3975859c1539
我们已经知道了如何把加减法化为全加法,那只要遇见加减法就将数值存入栈中,当出现乘除法时,取出栈中的值和当前的数值进行乘除法即可,本题的小技巧就是将乘除法与数字关联起来,加减法化为全化为加法。
代码如下:
class Solution {
public int calculate(String s) {
Stack <Integer> val = new Stack<>();
int v = 0;
char flag = '+';
for(int i = 0; i < s.length(); i++){
char ch = s.charAt(i);
if(Character.isDigit(ch)){
v = v * 10 + (ch - '0');
}
if( (!Character.isDigit(ch) && ch != ' ') || i == s.length()-1){
int pre;
switch (flag){
case '+': val.push(v); break;
case '-': val.push(-v);break;
case '*': pre = val.pop();val.push(pre*v);break;
case '/': pre = val.pop();val.push(pre/v);break;
}
v = 0;
flag = ch;
}
}
int result = 0;
while( !val.isEmpty() ){
int v1 = val.pop();
result += v1;
}
return result;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
网友评论