栈的示意图:
栈操作:
代码示例:
private double calculate(TextField tx) {
//定义两个栈 用来计算数据
Stack<Double> numStack = new Stack<>();
Stack<Character> charStack = new Stack<>();
//进行计算的标志
boolean flag = false;
//获取文本框的内容
String str = tx.getText();
int begin = 0;
int end = 0;
//遍历s
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (!Character.isDigit(ch)) {
//如果不是数字 ,首先判断字符栈是否为空 将end置为当前位置
end = i;
//将begin 和 end之间的的数字入数字栈
numStack.push(Double.parseDouble(str.substring(begin,end)));
begin = end+1;
if (flag == true) {
double second = numStack.pop();
double first = numStack.pop();
char opt = charStack.pop();
double result = operation(first, second, opt);
//将计算出的结果进行入栈
numStack.push(result);
}
if (!charStack.empty()) {
//非空 判断优先级
if (level(ch, charStack.get(charStack.size() - 1))) {
//优先级高 将flag设置为true 下一步放入数字的时候进行运算
flag = true;
}
}
//进行入栈
if(str.charAt(i) != '=') {
charStack.push(ch);
}
}
}
//全部入栈完成 进行计算
while (!numStack.empty() && !charStack.empty()) {
//从底往上计算
double first = numStack.remove(0);
double second = numStack.remove(0);
char opt = charStack.remove(0);
double result = operation(first, second, opt);
//运算完进行入栈
numStack.add(0,result);
}
return numStack.pop();
}
原文链接:https://blog.csdn.net/java_cG/article/details/107869670