增加支持小數(shù)點(diǎn)没咙、負(fù)數(shù)猩谊、括號(hào)、乘方運(yùn)算祭刚。
//雙棧表達(dá)式求值算法
private String stackCalculate(String str){
//記錄小數(shù)點(diǎn)索引位置
int dotIndex = 0;
//記錄是否存在負(fù)號(hào)
boolean negative = false;
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
if (!str.isEmpty()){
for (int i = 0;i < str.length();i++) {
String temp = String.valueOf(str.charAt(i));
if (temp.equals("(")) {
;
} else if (temp.equals("+")) {
ops.push("+");
} else if (temp.equals("-")) {
ops.push("-");
} else if (temp.equals("×")) {
ops.push("*");
} else if (temp.equals("÷")) {
ops.push("/");
} else if (temp.equals("√")) {
ops.push(temp);
} else if (temp.equals("^")) {
ops.push(temp);
} else if (temp.equals(")")) {
String rop = ops.pop();
double v = vals.pop();
if (rop.equals("+")) v = vals.pop() + v;
else if (rop.equals("-")) v = vals.pop() - v;
else if (rop.equals("*")) v = vals.pop() * v;
else if (rop.equals("/")) v = vals.pop() / v;
else if (rop.equals("√")) v = Math.sqrt(v);
else if (rop.equals("^")) v = Math.pow(vals.pop(),v);
vals.push(v);
} else if (temp.equals("-")) {
//存在負(fù)號(hào)
negative = true;
} else if (temp.equals(".")){
//保存小數(shù)點(diǎn)索引
dotIndex = i;
} else {
//處理小數(shù)
if (dotIndex > 0){
double v = Integer.parseInt(temp) * Math.pow(10, -(i - dotIndex));
double p = vals.pop();
if (p < 0){
vals.push(-(-p + v));
} else {
vals.push(p + v);
}
if (i+1 < str.length()){
if (!Character.isDigit(str.charAt(i+1))){
if (negative == true){
double np = vals.pop();
vals.push(-np);
negative = false;
}
dotIndex = 0;
}
}
continue;
}
//若操作數(shù)棧不為空
if (i-1 >= 0){
//操作多位數(shù)
if (Character.isDigit(str.charAt(i - 1))) {
int p = 0;
if (!vals.isEmpty()) {
p = vals.pop().intValue();
}
if (p < 0) {
p = -p;
}
double t = p * 10 + Integer.parseInt(temp);
if (negative == true) {
vals.push(-t);
if (i+1 < str.length()){
//下一位非數(shù)字
if (!Character.isDigit(str.charAt(i+1))){
negative = false;
}
//已到達(dá)最后一個(gè)字符
} else {
negative = false;
}
} else {
vals.push(t);
}
//非多位數(shù)
} else {
if (negative == true){
vals.push(-Double.parseDouble(temp));
//不含小數(shù)點(diǎn)或已處理完小數(shù)點(diǎn)
if (dotIndex == 0){
if (i+1 < str.length()){
//下一位非數(shù)字
if (!Character.isDigit(str.charAt(i+1))){
negative = false;
}
//已到達(dá)最后一個(gè)字符
} else {
negative = false;
}
}
} else {
vals.push(Double.parseDouble(temp));
}
}
//若操作數(shù)棧為空
} else {
if (negative == true){
vals.push(-Double.parseDouble(temp));
//不含小數(shù)點(diǎn)或已處理完小數(shù)點(diǎn)
if (dotIndex == 0){
if (i+1 < str.length()){
//下一位非數(shù)字
if (!Character.isDigit(str.charAt(i+1))){
negative = false;
}
//已到達(dá)最后一個(gè)字符
} else {
negative = false;
}
}
} else {
vals.push(Double.parseDouble(temp));
}
}
}
}
//最后牌捷,若表達(dá)式中不含括號(hào)墙牌,也要執(zhí)行計(jì)算
while (!ops.isEmpty() && !vals.isEmpty()){
String rop = ops.pop();
double v = vals.pop();
if (rop.equals("+")) {
v = vals.pop() + v;
} else if (rop.equals("-")){
v = vals.pop() - v;
} else if (rop.equals("*")){
v = vals.pop() * v;
} else if (rop.equals("/")){
v = vals.pop() / v;
} else if (rop.equals("√")){
v = Math.sqrt(v);
} else if (rop.equals("^")){
v = Math.pow(vals.pop(),v);
}
vals.push(v);
}
}
return String.valueOf(vals.pop());
}
}