实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 :
输入: "3+2*2" 输出: 7
输入:"3+5/2" 输出: 5 public long calculate (String s) {
// write code here
List<String> compute = patternIndex(s);
Queue<String> queue = new ArrayDeque<>();
// 四为和俩位的时候单独拿
Set<Integer> computeIndex = new TreeSet<>();
for (int i = 1; i < compute.size(); i+=2) {
if (compute.get(i).equals("*")||compute.get(i).equals("/")){
computeIndex.add(i);
computeIndex.add(i-1);
computeIndex.add(i+1);
}
}
List<Integer> list = new ArrayList<>(computeIndex);
for (int i = 0; i <list.size(); i++) {
System.out.println(compute.get(list.get(i)));
queue.add(compute.get(list.get(i)));
}
for (int i = list.size()-1; i >=0; i--) {
compute.remove((int)list.get(i));
}
for (int i = 1; i < compute.size(); i+=2) {
if ("+".equals(compute.get(i))||"+".equals(compute.get(i))){
queue.add(compute.get(i));
queue.add(compute.get(i-1));
}else {
queue.add(compute.get(i-1));
queue.add(compute.get(i));
}
}
long l = Long.valueOf(queue.poll());
int size = queue.size();
for (int i = 1; i < size; i+=2) {
String poll1 = queue.poll();
l = compute(l, Long.valueOf(queue.poll()), poll1);
}
return l;
}
private Long compute(Long pre,Long next,String compote){
switch (compote){
case "+": return pre+next;
case "-": return pre-next;
case "*": return pre*next;
case "/": return pre/next;
default:{
return 0L;
}
}
}
private List<String> patternIndex(String s){
char[] chars = s.toCharArray();
List<String> list = new ArrayList<>();
String num = "";
for (int i = 0; i < chars.length; i++) {
String str = chars[i]+ "";
if (!str.matches("[0-9]")){
if (!str.equals(" ")) {
list.add(num);
list.add(str);
num = "";
}
}else {
num += chars[i];
}
}
if (!num.equals("")) {
list.add(num);
}
return list;
}