| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | 
|---|---|---|---|
| Planning | 计划 | ||
| ? Estimate | ? 估计这个任务需要多少时间 | 20 | 30 | 
| Development | 开发 | ||
| ? Analysis | ? 需求分析 (包括学习新技术) | 60 | 240 | 
| ? Design Spec | ? 生成设计文档 | 20 | 40 | 
| ? Design Review | ? 设计复审 | 5 | 5 | 
| ? Coding Standard | ? 代码规范 (为目前的开发制定合适的规范) | 10 | 10 | 
| ? Design | ? 具体设计 | 20 | 40 | 
| ? Coding | ? 具体编码 | 120 | 990 | 
| ? Code Review | ? 代码复审 | 30 | 20 | 
| ? Test | ? 测试(自我测试,修改代码,提交修改) | 60 | 300 | 
| Reporting | 报告 | ||
| ? Test Repor | ? 测试报告 | 60 | 70 | 
| ? Size Measurement | ? 计算工作量 | 5 | 5 | 
| ? Postmortem & Process Improvement Plan | ? 事后总结, 并提出过程改进计划 | 10 | 10 | 
| 合计 | 450 | 1800 | 
我通过上网调查的方式了解到,这次任务有如下的几个特点:
- 准备工作:先在github上创建仓库,克隆到本地。
- 重要关键点:逆波兰式的理解以及应用运算表达式的生成和逆波兰式的转换
public class Calculate {
    // 构造方法传入题目
    public static int ans(String str) {
        // TODO Auto-generated constructor stub
        squestion = str;
        cutStr();
        reversePolishNotation();
        return compute();
    }
    // 题目的字符串
    public static int slen;
    public static String[] scut = new String[100];
    public static String squestion;
    // 存操作符的栈
    public static Stack<String> soperators = new Stack<>();
    // 存放转换后的逆波兰式
    public static Stack<String> srpn = new Stack<>();
    // 用于调换逆波兰式的顺序
    public static Stack<String> srpnb = new Stack<>();
    // 计算逆波兰式用的栈
    public static Stack<String> cal = new Stack<>();
    public static boolean isNum(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    // 将字符串的题目切割成数值和符号
    public static void cutStr() {
        int n = 0;
        String str=squestion.replaceAll(" ", "");
        squestion=str;
        for (int i = 0; i < squestion.length(); i++) {
            if (Character.isDigit(squestion.charAt(i))) {
                if ((i + 1) < squestion.length() && Character.isDigit(squestion.charAt(i + 1))) {
                    int num = (squestion.charAt(i) - ‘0‘) * 10 + (squestion.charAt(i + 1) - ‘0‘);
                    scut[n] = String.valueOf(num);
                    n++;
                    i++;
                } else if (squestion.charAt(i) == ‘ ‘) {
                } else {
                    int num = squestion.charAt(i) - ‘0‘;
                    scut[n] = String.valueOf(num);
                    n++;
                }
            } else {
                scut[n] = String.valueOf(squestion.charAt(i));
                n++;
            }
        }
        slen = n;
    }
    public static int priority(String str) {
        switch (str) {
        case "(":
            return 0;
        case "+":
        case "-":
            return 1;
        case "*":
        case "/":
            return 2;
        default:
            return -1;
        }
    }
    // 转换成逆波兰式
    public static void reversePolishNotation() {
        for (int i = 0; i < slen; i++) {
            if (!(scut[i].equals("+") || scut[i].equals("-") || scut[i].equals("*") || scut[i].equals("/") || scut[i].equals("(") ||  scut[i].equals(")"))) {
                srpn.push(scut[i]);
            } else {
                if (soperators.isEmpty() || scut[i].equals("(")) {
                    soperators.push(scut[i]);
                } else {
                    if (priority(scut[i]) > priority(soperators.peek())) {
                        soperators.push(scut[i]);
                    } else {
                        if(scut[i].equals(")")) {
                            while (!soperators.peek().equals("(")) {
                                srpn.push(soperators.pop());
                            }
                            soperators.pop();
                        }else {
                            while ((!soperators.isEmpty()) && (priority(soperators.peek()) >= priority(scut[i]))) {
                                srpn.push(soperators.pop());
                            }
                            soperators.push(scut[i]);
                        }
                        
                    }
                }
            }
        }
        while (!soperators.isEmpty()) {
            srpn.push(soperators.pop());
        }
    }
    public static int compute() {
        // 倒换逆波兰式顺序
        while (!srpn.isEmpty()) {
            srpnb.push(srpn.pop());
        }
        while (!srpnb.isEmpty()) {
            if (srpnb.peek().equals("+") || srpnb.peek().equals("-") || srpnb.peek().equals("*")
                    || srpnb.peek().equals("/")) {
                String sym = srpnb.pop();
                int a = Integer.parseInt(cal.pop());
                int b = Integer.parseInt(cal.pop());
                if (sym.equals("+")) {
                    cal.push(String.valueOf(b + a));
                } else if (sym.equals("-")) {
                    cal.push(String.valueOf(b - a));
                } else if (sym.equals("*")) {
                    cal.push(String.valueOf(b * a));
                } else {
                    cal.push(String.valueOf(b / a));
                }
            } else {
                cal.push(srpnb.pop());
            }
        }
        return Integer.parseInt(cal.pop());
    }
}请给出本次实验使用的代码规范:
| 测试输入 | 输出 | 是否符合预期效果 | |
| -n 100 -grade 1 | 执行成功 | 是 | |
| -n 100 -grade 2 | 执行成功 | 是 | |
| -n 100 -grade 3 | 执行成功 | 是 | |
| -grade 1 -n 100 | 执行成功 | 是 | |
| -grade 2 -n 100 | 执行成功 | 是 | |
| -grade 3 -n 100 | 执行成功 | 是 | 
这次的任务真的太难了,耗费的时间太多了。 很多内容都需要上网查找思路,经过这次的任务让我感到更加没有头绪 的怎么去面对去学习代码去适应,感觉自己还是需要更深的去理解和实践代码。


原文:https://www.cnblogs.com/rickowens/p/9672106.html