mini dc课堂练习补交

实验截图

实验代码

import java.util.StringTokenizer;
import java.util.Stack;

public class MyDC {
    /**
     * constant for addition symbol
     */
    private final char ADD = '+';
    /**
     * constant for subtraction symbol
     */
    private final char SUBTRACT = '-';
    /**
     * constant for multiplication symbol
     */
    private final char MULTIPLY = '*';
    /**
     * constant for division symbol
     */
    private final char DIVIDE = '/';
    /**
     * the stack
     */
    private Stack<Integer> stack;

    public MyDC() {
        stack = new Stack<Integer>();
    }

    public int evaluate(String expr) {
        int op1, op2, result = 0;
        String token;
        StringTokenizer tokenizer = new StringTokenizer(expr);

        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken();

            //如果是运算符,调用isOperator
            if (isOperator(token)) {
                op2=(stack.pop()).intValue();//从栈中弹出操作数2
                op1=(stack.pop()).intValue();//从栈中弹出操作数1
                result=evalSingleOp(token.charAt(0),op1,op2);//根据运算符和两个操作数调用evalSingleOp计算result;
                stack.push(new Integer(result));//计算result入栈;
            } else//如果是操作数
            stack.push(new Integer(Integer.parseInt(token)));//操作数入栈;
        }

        return result;
    }

    private boolean isOperator(String token) {
        return (token.equals("+") || token.equals("-") ||
                token.equals("*") || token.equals("/"));
    }

    private int evalSingleOp(char operation, int op1, int op2) {
        int result = 0;

        switch (operation) {
            case ADD:
                result = op1 + op2;
                break;
            case SUBTRACT:
                result = op1 - op2;
                break;
            case MULTIPLY:
                result = op1 * op2;
                break;
            case DIVIDE:
                result = op1 / op2;
        }

        return result;
    }
}

代码链接

练习总结

  • 1、对于isOperator()的调用不够明确。
  • 2、计算中间结果的代码为result=evalSingleOp(token.charAt(0),op1,op2);
  • 3、操作数入栈需进行强制类型转换Integer.parseInt(token)
posted @ 2017-05-03 16:23  Lee.X  阅读(111)  评论(0编辑  收藏  举报