public String getResult(){
Stack<Character> opAtor = new Stack<>();
Stack<Double> opNum = new Stack<>();
String exp = editText.getText().toString().trim();
exp = exp.concat("#");
opAtor.push('#');
for (int i = 0; i<exp.length(); i++) {//扫描字符串
if (Character.isDigit(exp.charAt(i))) {
double temp = exp.charAt(i) - '0';//读取exp【i】中的数字
double decimal = 0.0, w = 10;//如果这个字符exp【i】后面还有小数位数,w记录位数
while (Character.isDigit(exp.charAt(i+1))) { //检查exp【i】之后是否为数字,一直到不是数字为止
temp = temp * 10 + (exp.charAt(i+1) - '0'); //是则记录在temp中
i++;
}
if (exp.charAt(i+1) == '.') { //说明exp的下个字符为小数点
i++;//跳过小数点
while (Character.isDigit(exp.charAt(i+1))) {//读取小数部分
decimal = decimal + (double)(exp.charAt(i+1) - '0')/w;
w *= 10;
i++;
}
}
temp += decimal;//最后结果才是真正的temp
opNum.push(temp);
}
else {
switch (Precede(opAtor.peek(), exp.charAt(i))) { //比较运算符优先级函数
case '<':
opAtor.push(exp.charAt(i));//高于栈顶
break;
case '='://只有一种情况,栈顶为左括号,exp【i】为右括号
opAtor.pop();
break;
case '>'://优先级低于栈顶,开始计算
char c = opAtor.pop();
double b = opNum.pop();
double a = opNum.pop();
opNum.push(Operator(a, c, b));//计算(a c b),结果入栈
i--;//循环结束执行i++操作,所以指示器i回退,否则会漏掉一个运算符(exp[i]并没有入栈)
break;
}
}
}
return String.valueOf(opNum.pop());
}