问题
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
例子
思路
-
方法1
中缀表达式->后缀表达式
-
方法2
代码
//方法1
class Solution {
public int calculate(String s) {
//存后缀表达式,因为如果有42呢,不方便用sb
List<String> list = new ArrayList<>();
Stack<Character> st_sign = new Stack<>();
//中缀变后缀
for(int i=0; i<s.length(); i++) {
char c = s.charAt(i);
//如果是空格,就下一个
if(c==' ') continue;
//如果c是符号
if(!Character.isDigit(c)) {
//如果栈为空
if(st_sign.size()==0) st_sign.push(c);
else {
//先弹出优先级>=他的符号,添加到后波兰表达式,再把该符号放入
if(c=='+' || c=='-') {//其他符号都>=c
while(st_sign.size()>0)
list.add(String.valueOf(st_sign.pop()));
}else{//符号为'*'或'/',则只有*和/才能弹出,,再把该符号放入栈
while(st_sign.size()>0) {
if(st_sign.peek()=='*' || st_sign.peek()=='/')
list.add(String.valueOf(st_sign.pop()));
else break;
}
}
st_sign.push(c);
}
}else{//c为数字
int j=i+1;
while(j<s.length()) {
if(Character.isDigit(s.charAt(j))) j++;
else break;
}
list.add(s.substring(i,j));
i=j-1;
}
}
//把符号栈的中符号弹出来
while(st_sign.size()>0) list.add(String.valueOf(st_sign.pop()));
//求后缀表达式的值
String signs = "+-*/";
Stack<Integer> st_num = new Stack<>();
for(int i=0; i<list.size(); i++) {
String t = list.get(i);
//是符号
if(signs.indexOf(t)>-1) {
int b = st_num.pop();
int a = st_num.pop();
switch(t) {
case "+":
st_num.push(a+b);break;
case "-":
st_num.push(a-b);break;
case "*":
st_num.push(a*b);break;
case "/":
st_num.push(a/b);break;
}
}
//是数字
else{
st_num.push(Integer.valueOf(t));
}
}
return st_num.pop();
}
}
//方法2