第一步;定义异常类
第二步;实现栈的算法和步骤
具体步骤为————//初始化表达式 //定义运算数栈 //定义运算符栈 //OPTR初始化为定界符 //两栈栈顶初始化 //依次读取表达式字符 //字符就在字符栈处处理,比较当前与栈顶运算符的优先级 //当前运算符优先级高,运算符入栈(当前运算符优先级低,运算数出栈) //根据运算符类型运算 //运算结果入栈 //返回栈顶运算结果.最终得出结果
第三步;输出结果
本题计算式子为(4+2)*3-5
结果为13
步骤如图所示
最终输出结果为13
程序代码
class BiaodashiException extends RuntimeException {
private static final long serialVersionUID = 1L;
public BiaodashiException() {}
public BiaodashiException(String message) {
super(message);
}
}
class Biaodashi {
private String expr;
public Biaodashi(String expr) {
this.expr = expr;
}
public int compute() {
char[] OPND = new char[10];
char[] OPTR = new char[10];
OPTR[0] = '#';
int top1 = -1, top2 = 0;
char[] chars = expr.toCharArray();
for (int i = 0; i < chars.length; ) {
int grade, num1, num2, oper, result = 0;
if (chars[i] >= 48 && chars[i] <= 57) {
OPND[++top1] = (char)(chars[i++]-48);
} else {
grade = comp(chars[i], OPTR[top2]);
if (grade == 1) {
OPTR[++top2] = chars[i++];
} else if (grade == -1) {
num2 = OPND[top1--];
num1 = OPND[top1--];
oper = OPTR[top2--];
switch (oper) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
break;
}
OPND[++top1] = (char)result;
} else {
top2--;
i++;
}
}
}
return OPND[top1];
}
private int comp(char oper1, char oper2) {
switch (oper1) {
case '+':
case '-':
if (oper2 == '(' || oper2 == '#') {
return 1;
} else {
return -1;
}
case '*':
case '/':
if (oper2 == '*' || oper2 == '/') {
return -1;
} else {
return 1;
}
case '(':
return 1;
case ')':
if (oper2 == '(') {
return 0;
} else {
return -1;
}
case '#':
if (oper2 == '#') {
return 0;
} else {
return -1;
}
default:
throw new BiaodashiException("符号无法识别");
}
}
}
public class BiaodashiTester {
public static void main(String[] args) {
Biaodashi Biaodashi = new Biaodashi("(4+2)*3-5#");
int result = Biaodashi.compute();
System.out.println("表达式结果:" + result);
}
}