一、需求分析

二、功能分析
根据需求分析,可以得出该项目所需的功能:
三、设计实现

四、测试运行
如下图所示,当n=50时,循环产生50个算式,学生可输入答案,与result文件中的正确答案对比是否正确。

五、核心代码
     /**
     * 提前将 符号的优先级定义好
     */
    private static final Map<Character, Integer> basic = new HashMap<Character, Integer>();
    static {
        basic.put(‘-‘, 1);
        basic.put(‘+‘, 1);
        basic.put(‘*‘, 2);
        basic.put(‘/‘, 2);
        basic.put(‘(‘, 0);
    }
/**
     * 得到计算式的字符串
     */
    public String getString() {
        String[] operate = new String[] { "+", "-", "*", "/" };
        int[] number = new int[101];
        for (int i = 0; i <= 100; i++)
            number[i] = i;
        int[] type = new int[3];
        for (int i = 0; i < 3; i++)
            type[i] = i;
        Random r = new Random();
        int t = type[r.nextInt(3)];
        if (t == 0){
            String  str1 = operate[r.nextInt(4)];
            String  str2 = operate[r.nextInt(4)];
            if (str1.equals(str2))
                return null;
            else 
                return number[r.nextInt(101)] + str1 + number[r.nextInt(101)] + str2
                        + number[r.nextInt(101)];            
        }
        else if (t == 1){
            String  str1 = operate[r.nextInt(4)];
            String  str2 = operate[r.nextInt(4)];
            String  str3 = operate[r.nextInt(4)];
            if(str1.equals(str2)&&str1.equals(str3))
                return null;
            else 
                return number[r.nextInt(101)] + str1 + number[r.nextInt(101)] + str2
                        + number[r.nextInt(101)] + str3 + number[r.nextInt(101)];
        }
        else{
            String  str1 = operate[r.nextInt(4)];
            String  str2 = operate[r.nextInt(4)];
            String  str3 = operate[r.nextInt(4)];
            String  str4 = operate[r.nextInt(4)];
            if(str1.equals(str2)&&str1.equals(str3)&&str1.equals(str4))
                return null;
            else
                return number[r.nextInt(101)] + str1 + number[r.nextInt(101)] + str2
                        + number[r.nextInt(101)] + str3 + number[r.nextInt(101)] + str4
                        + number[r.nextInt(101)];
        }
            
    }
/**
     * 将 中缀表达式 转化为 后缀表达式
     */
    public String toSuffix(String infix) {
        if(infix==null)
            return null;
        List<String> queue = new ArrayList<String>();// 定义队列 用于存储 数字 以及最后的 后缀表达式
        List<Character> stack = new ArrayList<Character>();// 定义栈 用于存储 运算符,最后stack中会被 弹空
        char[] charArr = infix.trim().toCharArray();// 字符数组 用于拆分数字或符号
        String standard = "*/+-()"; // 判定标准 将表达式中会出现的运算符写出来
        char ch = ‘&‘;// 在循环中用来保存 字符数组的当前循环变量的 这里仅仅是初始化一个值 没有意义
        int len = 0;// 用于记录字符长度 【例如100*2,则记录的len为3 到时候截取字符串的前三位就是数字
        for (int i = 0; i < charArr.length; i++) {// 开始迭代
            ch = charArr[i]; // 保存当前迭代变量
            if (Character.isDigit(ch)) { // 如果当前变量为 数字
                len++;
            } else if (Character.isLetter(ch)) {// 如果当前变量为 字母
                len++;
            } else if (ch == ‘.‘) {// 如果当前变量为 . 会出现在小数里面
                len++;
            } else if (Character.isSpaceChar(ch)) {// 如果当前变量为 空格 支持表达式中有空格出现
                if (len > 0) {// 若为空格 代表 一段结束 ,就可以往队列中 存入了 【例如100 * 2 100后面有空格
                                // 就可以将空格之前的存入队列了】
                    queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));// 往队列存入截取的字符串
                    len = 0;// 长度置空
                }
                continue;// 如果空格出现,则一段结束 跳出本次循环
            } else if (standard.indexOf(ch) != -1) { // 如果是上面标准中的 任意一个符号
                if (len > 0) { // 长度也有
                    queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len, i)));// 说明符号之前的可以截取下来做数字
                    len = 0;// 长度置空
                }
                if (ch == ‘(‘) {// 如果是左括号
                    stack.add(ch);// 将左括号 放入栈中
                    continue; // 跳出本次循环 继续找下一个位置
                }
                if (!stack.isEmpty()) {// 如果栈不为empty
                    int size = stack.size() - 1;// 获取栈的大小-1 即代表栈最后一个元素的下标
                    boolean flag = false;
                    while (size >= 0 && ch == ‘)‘ && stack.get(size) != ‘(‘) {
                        queue.add(String.valueOf(stack.remove(size)));
                        size--;
                    }
                    while (size >= 0 && !flag && basic.get(stack.get(size)) >= basic.get(ch)) {
                        queue.add(String.valueOf(stack.remove(size)));
                        size--;
                    }
                }
                if (ch != ‘)‘) {
                    stack.add(ch);
                } else {
                    stack.remove(stack.size() - 1);
                }
            }
            if (i == charArr.length - 1) {
                if (len > 0) {
                    queue.add(String.valueOf(Arrays.copyOfRange(charArr, i - len + 1, i + 1)));
                }
                int size = stack.size() - 1;
                while (size >= 0) {
                    queue.add(String.valueOf(stack.remove(size)));
                    size--;
                }
            }
        }
        return queue.stream().collect(Collectors.joining(","));
    }
原文:https://www.cnblogs.com/onemorerun/p/13803618.html