• 计算四则运算表达式(Java语言实现)


      计算四则运算表达式主要是分两步运算

          第一步是把 中缀表达式 转换成 后缀表达式。参考大一下期学的 《数据结构与算法分析--C语言描述》3.3.3 教材,完成下列代码:

    static String mid_to_suf(String str) {
            Stack<Character> s = new Stack<Character>();
            String suf = new String();
            HashMap<Character, Integer> map = new HashMap<Character, Integer>();
            map.put('+', 1); // 设置运算符的优先级
            map.put('-', 1);
            map.put('*', 2);
            map.put('/', 2);
            map.put('(', 3);
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                while (c >= '0' && c <= '9') {
                    suf += c;
                    if (i + 1 < str.length())
                        i++;
                    c = str.charAt(i);
                }
                suf += ' ';
                if (c == '=')
                    break;
                if (c == ' ')
                    suf += c;
                else {
                    if (s.isEmpty())
                        s.push(c);
                    else {
                        while (!s.isEmpty()) {
                            char op = s.peek();
                            if (op == '(')
                                break;
                            if (map.get(op) < map.get(c))
                                break;
                            else {
                                s.pop();
                                suf += op;
                            }
                        }
                        s.push(c);
                    }
                }
            }
            while (!s.isEmpty())
                suf += s.pop();
            return suf;
        }
    View Code

      第二步是计算后缀表达式的方法, 曾在湘大oj上做过这样的题目 http://202.197.224.59/exam/index.php/problem/read/id/1036 

      

        private static Fraction cal(String s) {
            Stack<Fraction> stack = new Stack<Fraction>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                boolean flag = false;
                int tmp = 0;
                if (c == ' ')
                    continue;
                while (is_num(c)) {
                    tmp *= 10;
                    tmp += (c - '0');
                    i++;
                    c = s.charAt(i);
                    flag = true;
                }
                if (flag) {
                    i--;
                    stack.push(new Fraction(tmp, 1));
                    tmp = 0;
                } else {
                    Fraction x1 = stack.pop();
                    Fraction x2 = stack.pop();
                    Fraction ans = new Fraction(1, 1);
                    if (c == '*')
                        ans = x1.mul(x2);
                    else if (c == '-')
                        ans = x2.sub(x1);
                    else if (c == '+')
                        ans = x1.add(x2);
                    else if (c == '/')
                        ans = x2.div(x1);
                    stack.push(ans);
                }
            }
            return stack.pop();
        }
    
        private static boolean is_num(char c) {
            if (c >= '0' && c <= '9')
                return true;
            return false;
        }
    
        static class Fraction {
            private int numerator, denominator;
    
            public Fraction(int numerator, int denominator) {
                this.numerator = numerator;
                this.denominator = denominator;
            }
    
            int gcd(int x, int y) {
                while (y != 0) {
                    int z = x % y;
                    x = y;
                    y = z;
                }
                return x;
            }
    
            void reduction() {
                int tmp = gcd(this.numerator, this.denominator);
                this.numerator = this.numerator / tmp;
                this.denominator = this.denominator / tmp;
            }
    
            Fraction add(Fraction f1) {
                int temp = f1.denominator;
                f1.denominator = this.denominator * f1.denominator;
                f1.numerator = this.numerator * temp + f1.numerator * this.denominator;
                f1.reduction();
                return f1;
            }
    
            Fraction sub(Fraction f1) {
                int tmp = f1.denominator;
                f1.denominator = this.denominator * f1.denominator;
                f1.numerator = this.numerator * tmp - f1.numerator * this.denominator;
                f1.reduction();
                return f1;
            }
    
            Fraction mul(Fraction f1) {
                f1.denominator = f1.denominator * this.denominator;
                f1.numerator = f1.numerator * this.numerator;
                f1.reduction();
                return f1;
            }
    
            Fraction div(Fraction f1) {
                int tmp = f1.denominator;
                f1.denominator = this.denominator * f1.numerator;
                f1.numerator = this.numerator * tmp;
                f1.reduction();
                return f1;
            }
        }
    View Code

      因此稍微复杂一点的题目就可以做出来了 不过,中间还有些许 负数什么的,还有文件操作之类的要求,时间紧迫,我会慢慢一步一步完成之后的要求的。

    之后是测试样例。。。

  • 相关阅读:
    微信分享接口
    MySQL的语句执行顺序
    C++类内存分布
    static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
    c++内存中字节对齐问题详解
    msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍
    使用valgrind检查内存
    GDB调试教程
    Linux一些经典书籍
    C++编程语言学习资料
  • 原文地址:https://www.cnblogs.com/sherlockmoon/p/5248948.html
Copyright © 2020-2023  润新知