利用双栈法解决运算问题
1.生成符号栈和数据栈:
private static Deque<Character> opr = new LinkedList<>(); //符号栈
private static Deque<Double> number = new LinkedList<>(); //数字栈
2.将表达式变成字符之后进行遍历
char[] str = formula.toCharArray(); //转换成字符
int i = 0;
while (i < str.length) { //遍历字符
3.入栈操作(注意符号优先级和数字连续,小数点的问题)
char c = str[i];
if (isOpr(c)) {
Character peek = opr.peek(); //peek()找到栈顶第一个值但是不删除
while (peek != null && isHigherPro(peek, c)) { //比较优先级
cal();
peek = opr.peek();
}
opr.push(c);
i++;
} else {
double num = 0;
double num2 = 0;
int times = 1;
boolean flag = false;
while (i < str.length && !isOpr(str[i])) { //取连续的数字
if(str[i] == '.'){
flag = true;
}else {
if(flag){
double val = (str[i] - '0');
for(int j = 0; j < times; j++){
val /= 10.0;
}
times++;
num2 += val;
}else {
num = num * 10 + (str[i] - '0'); //将字符转为数字运算
}
}
i++;
}
number.push(num + num2);
}
}
private static boolean isHigherPro(char peek, char c) { //比较优先级
return ((peek == '*' || peek == '/') || (c == '+' || c == '-'));
}
private static boolean isOpr(char c) { //判断c是否为操作符
return c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == 'C' || c == '(' || c == ')';
}
4.运算操作
private static void cal() {
double a = number.pop();
double b = number.pop();
char c = opr.pop();
switch (c) {
case '+':
number.push(b + a);
break;
case '-':
number.push(b - a);
break;
case '*':
number.push(b * a);
break;
case '/':
if (a != 0) {
number.push(b / a);
}
break;
case '%':
if (a != 0) {
number.push(b % a);
}
break;
}
}
5运行结果
6.将代码链接:(监听链接)将按钮的输入放入链表中,再将其遍历进行操作(可以模块划分)
StringBuilder al = new StringBuilder();
7.将完整表达式显示,并且将清空键注意表达式清空
8.代码应该得出的结果