实现思路
中缀表达式转换为后缀表达式
- 如果遇到数字,我们就直接将其输出。
- 如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。
- 如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈。
- 如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈。
- 如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
计算后缀表达式
public int doCal(List<String> list){ Stack<Integer> stack = new Stack<Integer>(); for(int i=0;i<list.size();i++){ String s = list.get(i); int t=0; if(!isOp(s)){ t = Integer.parseInt(s); stack.push(t); }else{ if(s.equals("+")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2+a1; stack.push(v); }else if(s.equals("-")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2-a1; stack.push(v); }else if(s.equals("*")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2*a1; stack.push(v); }else if(s.equals("/")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2/a1; stack.push(v); } } }
UML类图
Test类测试图
代码框架
学习感受
上一周的结对学习,我们小组仅仅能实现最简单的加减乘除运算,最后以遗憾告一段落。但是这一周,我们两个精密配合,学习了如何进行中缀表达式转换为后缀表达式以及如何计算后缀表达式,最终完成了对复杂的四则运算(带有括号以及真分数)的代码实现,我们认为这是一个能力上的突破,也让我对结对学习有了全新的看法。之前我仅仅觉得两个人互帮互助地提醒着学习,但是经过这一周,我发现这个关系像是教练员和健身员,你们相互配合,轻松的时候相互鼓励,在最艰难、马上要实现目标的时候搭档会助力,不仅完成了目标,而且相互的关系也变得更加融洽!
PSP(Personal Software Process)时间
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 30min | 7.1% |
设计 | 2h | 28.5% |
代码实现 | 3.5h | 50% |
测试 | 30min | 7.1% |
分析总结 | 30min | 7.3% |