Discuss / Java / 5.28 中缀转后缀及运算 作业

5.28 中缀转后缀及运算 作业

Topic source

ANGERIED

#1 Created at ... [Delete] [Delete and Lock User]
说一下思路:
1. 把一个Deque当成两个栈,相当于一分为二,上面的栈专门放四则运算符,下面的栈专门放数字
2. 利用string转字符数组,我成功分离了数字和四则运算符,但这样做用bug。一来是数字分离的不够完全,如果是两位数以上的数字就会失败。二来是代码比较烦杂。我有考虑用正则表达式去匹配,但是目前暂时不想跳过去学,所以就没考虑该方案。
3. 注意在处理完上下栈,并且取数字和操作符进行运算的时候,要注意哪个数字放在运算符前,不然可能会出现正负的问题。
4. 按照廖老师上面的思路一样,使用do-while控制,当最后一组运算做完后,将计算完的值压入栈,栈的长度为1即可跳出循环,且该值就是最终的结果了。
public static void main(String[] args) {
        String exp = "1 + 2 * (9 - 5)";
        SuffixExpression se = compile(exp);
        int result = se.execute();
        System.out.println(exp + " = " + result + " " + (result == 1 + 2 * (9 - 5) ? "✓" : "✗"));
    }

    static SuffixExpression compile(String exp) {
        // TODO:        
        Deque<String> deque = new LinkedList<>();
        char[] chars = exp.toCharArray();

        for (char c : chars) {
            if (getYorN(c)) {
                deque.offerFirst(String.valueOf(c));
            } else if (getIntegYorN(c)) {
                deque.offerLast(String.valueOf(c));
            } else {
                continue;
            }
        }

        return new SuffixExpression(deque);
    }

    static boolean getYorN(char it) {
        switch (it) {
            case '+':
            case '-':
            case '*':
            case '/':
                System.out.println(it);
                return true;
            default:
                return false;
        }
    }

    static boolean getIntegYorN(char it) {
        switch (it) {
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            case '0':
                System.out.println(it);
                return true;
            default:
                return false;
        }
    }
}

class SuffixExpression {
    Deque<String> deque;

    public SuffixExpression(Deque<String> deque) {
        this.deque = deque;
    }

    int execute() {
        // TODO:        
      do {
            String c1 = deque.pollLast();
            String c2 = deque.pollLast();
            String opt = deque.pollFirst();
            deque.offerLast(String.valueOf(getNum(c1, c2, opt)));
        }
        while (deque.size() != 1);

        return Integer.valueOf(deque.poll());
    }

    static int getNum(String c1, String c2, String opt) {
        Integer i1 = Integer.valueOf(c1);
        Integer i2 = Integer.valueOf(c2);
        switch (opt) {
            case "+":
                return i2 + i1;
            case "-":
                return i2 - i1;
            case "*":
                return i2 * i1;
            case "/":
                return i2 / i1;
            default:
                return 0;
        }
    }

ANGERIED

#2 Created at ... [Delete] [Delete and Lock User]
在回头看了一下,代码里bug真的很多很多,不止以上那一点,只能说刚好对于此表达式生效,还得继续加油

不通用 就没 啥意义了。。。。


  • 1

Reply