实现Linux下dc的功能,计算后缀表达式的值

提交测试截图和码云练习项目链接,实现Linux下dc的功能,计算后缀表达式的值

-将运算符写在两个操作数之后的表达式称为“后缀表达式”,如上面的中缀表达式可转换为后缀表达式1 2 3 4 - * + 5 +。后缀表达式中没有括号,而且运算符没有优先级。后缀表达式的求值过程能够严格地从左到右按顺序进行,符合运算器的求值规律。

应注意的问题;

-老师主要是想考察课上是否听懂了,并且检验我们的实际动手编程能力。

在课堂是是听懂了老师所说的课程,虽然没有编写出相应的代码,但也回来及时将博客补上,并且对代码进行了了解。
-优先级问题;
-入栈,出栈顺序参考PPT

老师给出的代码(不完整)

mport 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 () {
                //从栈中弹出操作数2
               

                //从栈中弹出操作数1
               

                //根据运算符和两个操作数调用evalSingleOp计算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;

    }

}

-MyDCTester

import java.util.Scanner;
public class MyDCTester  {public static void main (String[] args) {
           String expression, again;

            int result;

          try {
              Scanner in = new Scanner(System.in);

              do {
                  MyDC evaluator = new MyDC();
                  System.out.println("Enter a valid postfix expression: ");
                  expression = in.nextLine();

                  result = evaluator.evaluate(expression);
                  System.out.println();

                  System.out.println("That expression equals " + result);

                  System.out.print("Evaluate another expression [Y/N]? ");
                  again = in.nextLine();
                  System.out.println();
              }
              while (again.equalsIgnoreCase("y"));
          } catch (Exception IOException) {
              System.out.println("Input exception reported");
          }
}
}

dc

dc 命令是一个任意精度的算术计算器。dc 命令从 File 参数或者标准输入得到其输入直到它读到一个文件结束符。一旦 dc 命令接收到输入,它将求出计算值并将计算值写入到标准输出当中。它按十进制整数计算,但是您可以指定输入和输出的基数,以及小数部分保留的位数。dc 命令结构如同一个堆栈、逆波兰表示法计算。

考点:

考课堂上刚讲的入栈和弹栈

补充代码如下

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

运行结果:

码云链接
posted @ 2017-05-31 18:25  20155329胡佩伦  阅读(1359)  评论(0编辑  收藏  举报