package io.github.vxzh.datastructure.less6.expr;
import java.util.Stack;
public class InfixExpr {
String expr = null;
public InfixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
check();
Stack<Character> operateStack = new Stack<Character>();
Stack<Integer> numStack = new Stack<Integer>();
char[] ch = expr.toCharArray();
for (int i = 0; i < ch.length; i++) {
if (Character.isDigit(ch[i])) {
int tmp = Integer.parseInt("" + ch[i]);
while (i < ch.length - 1 && Character.isDigit(ch[++i])) {
tmp = tmp * 10 + Integer.parseInt("" + ch[i]);
}
numStack.push(tmp);
}
if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') {
operateStack.push(ch[i]);
}
if (!(operateStack.isEmpty()) && (char) operateStack.peek() == '*') {
int tmp = Integer.parseInt("" + ch[++i]);
while (i < ch.length - 1 && Character.isDigit(ch[++i])) {
tmp = tmp * 10 + Integer.parseInt("" + ch[i]);
}
if (i != ch.length - 1) {
i--;
}
numStack.push(tmp);
int tmp1 = Integer.parseInt("" + numStack.pop());
int tmp2 = Integer.parseInt("" + numStack.pop());
numStack.push(tmp1 * tmp2);
operateStack.pop();
}
if (!(operateStack.isEmpty()) && (char) operateStack.peek() == '/') {
int tmp = Integer.parseInt("" + ch[++i]);
while (i < ch.length - 1 && Character.isDigit(ch[++i])) {
tmp = tmp * 10 + Integer.parseInt("" + ch[i]);
}
if (i != ch.length - 1) {
i--;
}
numStack.push(tmp);
int tmp1 = Integer.parseInt("" + numStack.pop());
int tmp2 = Integer.parseInt("" + numStack.pop());
numStack.push(tmp2 / tmp1);
operateStack.pop();
}
}
// 将栈中的数字和运算法逆置,便于计算
reverse(numStack);
reverse(operateStack);
while (!(operateStack.isEmpty())) {
if ((char) operateStack.peek() == '+') {
int tmp1 = Integer.parseInt("" + numStack.pop());
int tmp2 = Integer.parseInt("" + numStack.pop());
numStack.push(tmp1 + tmp2);
}
if ((char) operateStack.peek() == '-') {
int tmp1 = Integer.parseInt("" + numStack.pop());
int tmp2 = Integer.parseInt("" + numStack.pop());
numStack.push(tmp1 - tmp2);
}
operateStack.pop();
}
return Float.parseFloat("" + numStack.pop());
}
private void reverse(Stack s) {
if (s.isEmpty()) {
return;
}
// 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。
Object tmp1 = s.pop();
reverse(s);
if (s.isEmpty()) {
s.push(tmp1);
return;
}
Object temp2 = s.pop();
reverse(s);
s.push(tmp1);
reverse(s);
s.push(temp2);
}
private boolean check() {
if (expr.length() <= 0) {
return false;
} else if ('+' == expr.charAt(0) || '-' == expr.charAt(0) || '*' == expr.charAt(0) || '/' == expr.charAt(0)) {
return false;
} else if ('+' == expr.charAt(expr.length() - 1) || '-' == expr.charAt(expr.length() - 1) || '*' == expr.charAt(expr.length() - 1) || '/' == expr.charAt(expr.length() - 1)) {
return false;
}
return true;
}
}