实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
此算法的思路很简单,先把乘除法的值计算出来,最终将所有的运算简化成只有加法。
先跳过空格
出现了数字则记录整个数字是多少,然后根据之前的运算符决定下一步:
如果是加号’+’,说明前面的运算独立于以后的运算,可以将结果暂时放入栈;
如果是减号’-’,可以看成-1 * Num,然后将-Num入栈;
如果是乘号’*‘或者除号’/’,由于前面的运算独立于此,可以先计算stack.pop()和Num积,然后结果入栈。
最后将栈中的所有元素相加就是答案。
class Solution {
public int calculate(String s) {
char[] ch=s.toCharArray();
Stack<Integer> stack=new Stack<>();
char f='+';
for(int i=0;i<ch.length;i++){
if(ch[i]==' ') continue;
else if(ch[i]>='0' && ch[i]<='9'){//Character.isDigit(ch[i]
int nums=ch[i]-'0';
while(i+1<ch.length && ch[i+1]>='0' && ch[i+1]<='9'){
i++;
nums=nums*10+(ch[i]-'0');
}
switch(f){
case '+':stack.push(nums);break;
case '-':stack.push(-nums);break;
case '*':stack.push(stack.pop()*nums);break;
default :stack.push(stack.pop()/nums);break;
}
}
else
f=ch[i];
}
int res=0;
for(int temp:stack)
res+=temp;
return res;
}
}
//先求后缀表达式再进行计算
class Solution {
public int calculate(String s) {
String str=behind(s);
String[] ch=str.split(" ");//这里用split,不要用toCharArray
Stack<Integer> stack=new Stack<>();
for(int i=0;i<ch.length;i++){
if(ch[i].charAt(0)>='0' && ch[i].charAt(0)<='9'){//如果是数字
stack.push(Integer.parseInt(ch[i]));
}
else{
Integer a,b;
switch(ch[i]){
case "+":
stack.push(stack.pop()+stack.pop());
break;
case "-":
a=stack.pop();
b=stack.pop();
stack.push(b-a);
break;
case "*":
stack.push(stack.pop()*stack.pop());
break;
default:
a=stack.pop();
b=stack.pop();
stack.push(b/a);
break;
}
}
}
return stack.pop();
}
//求后缀表达式
static String behind(String s){
Stack<Character> stack=new Stack<>();//注意不能用基本类型
char[] ch=s.toCharArray();
StringBuilder str=new StringBuilder();
for(int i=0;i<ch.length;i++){
if(ch[i]==' ') continue;
else if(ch[i]>='0' && ch[i]<='9'){
int num=ch[i]-'0';
while(i+1<ch.length && ch[i+1]>='0' && ch[i+1]<='9'){
i++;
num=num*10+(ch[i]-'0');
}
str.append(" ").append(num);
}
else {
if(stack.isEmpty())
stack.push(ch[i]);
else{
if(ch[i]=='+' || ch[i]=='-'){
while(!stack.isEmpty()){
str.append(" ").append(stack.pop());
}
stack.push(ch[i]);
}
else{
while(!stack.isEmpty() && ( stack.peek()=='*' || stack.peek()=='/')){
str.append(" ").append(stack.pop());
}
stack.push(ch[i]);
}
}
}
}
while(!stack.isEmpty()){
str.append(" ").append(stack.pop());
}
return str.toString().trim();
}
}