一、作业要求
二、设计实现
2.1 类
- Calculate
- Expression
- FileIO
- Fraction
- Grade
- Save
2.2 关系图

三、代码说明
3.1 Calculate类
Calculate类通过将中缀表达式转化为后缀表达式,再求值。
- 中缀转后缀时,采用一个队列和一个栈,数字输入到队列,运算符压入栈。在压入栈时,检查栈顶元素的优先级,要保证压入栈的元素的优先级最高。若栈顶元素大于等于想压入栈的元素,则把栈顶元素弹出,继续检查,直到被压入栈的元素的优先级是最高的。遇到"(“先入栈,遇到”)“把”("之后的元素弹出到队列,括号不输出到队列。
- 后缀表达式求值时,遇到数字就压入栈,遇到运算符就弹出两个数字进行运算。因为最后的结果是分数,所以从一开始运算就把运算数全部转换为分数进行计算最后化简。
- 主要代码:
public Fraction calculate(Queue<String> queue) {
Stack<Fraction> fracStack = new Stack<>();
String str = "";
Save.string = "";
while (!queue.isEmpty() ) {
String s = queue.remove();
if (isDigital(s.charAt(0))) {
Fraction f = new Fraction(Integer.parseInt(s));
fracStack.push(f);
} else if (isOperator(s.charAt(0))) {
char c = s.charAt(0);
Fraction f = fracStack.pop();
Fraction f1 = new Fraction(f.getNumerator(),f.getDenominator());
f = fracStack.pop();
Fraction f2 = new Fraction(f.getNumerator(),f.getDenominator());
if ( c == '-' ) {
f = f2.sub(f1);
f.Appointment();
if (f.getDenominator() < 0 || f.getNumerator() < 0 ) {
fracStack.push(new Fraction(100000));
break;
}
}
if ( c == '/'){
f2.Appointment();
if(f1.getDenominator()==0 || f1.getNumerator() ==