• 实现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));
                }
                //操作数入栈;
            }
    
    
    运行结果:

    码云链接
  • 相关阅读:
    顺时针打印矩阵
    topK问题
    9. Palindrome Number(回文数)
    Spinner用法详解
    翻转字符串
    清雨的自助餐(斐波那契数列的应用)
    2. Add Two Numbers(链表尾插法)
    assign和weak的区别
    14-最长公共前缀
    12 13-int与罗马数字转换
  • 原文地址:https://www.cnblogs.com/hpl20155329/p/6925448.html
Copyright © 2020-2023  润新知