问题
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
例子
思路
-
方法1
中缀表达式->后缀表达式
-
方法2
代码
//方法1
class Solution {
public int calculate(String s) {
//获取后缀表达式(没有括号了)
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;
else if(Character.isDigit(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;
}else{
if(st_sign.size()==0) st_sign.push(c);
else if(c=='+' || c=='-'){
//只有+-,没有
while(st_sign.size()>0 && st_sign.peek()!='(') {
list.add(String.valueOf(st_sign.pop()));
}
st_sign.push(c);
}else if(c=='(') st_sign.push(c);
else if(c==')') {
while(st_sign.peek()!='(')
list.add(String.valueOf(st_sign.pop()));
//将(弹出
st_sign.pop();
}
}
}
//符号栈中还有符号,因为是符号在后面
while(st_sign.size()>0) list.add(String.valueOf(st_sign.pop()));
//计算后缀表达式
Stack<Integer> st = new Stack<>();
for(int i=0; i<list.size(); i++) {
String now = list.get(i);
//如果是符号
if(now.equals("+") || now.equals("-")) {
int b = st.pop();
int a = st.pop();
if(now.equals("+")){
st.push(a+b);
}else st.push(a-b);
}else//是数字
{
st.push(Integer.valueOf(now));
}
}
//结果在最后的栈中
return st.pop();
}
}
//方法2