码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-03-06 23:28:57      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

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

      第一步是把 中缀表达式 转换成 后缀表达式。参考大一下期学的 《数据结构与算法分析--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);
            if (c == ‘=‘)
                break;
            if (c == ‘ ‘ || (c >= ‘0‘ && c <= ‘9‘))
                suf += c;
            else if (c == ‘(‘)
                s.push(c);
            else if (c == ‘)‘){
                while (!s.isEmpty()){
                    char op = s.pop();
                    if (op == ‘(‘)
                        break;
                    suf += op;
                }
            }
            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;
    }

 

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

技术分享
private static int cal(String s) {
        Stack<Integer> stack = new Stack<Integer>();
        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(tmp);
                tmp = 0;
            }
            else {
                int x1 = stack.pop();
                int x2 = stack.pop();
                int ans = 0;
                if (c == ‘*‘)
                    ans = x1 * x2;
                else if (c == ‘-‘)        
                    ans = x2 - x1;
                else if (c == ‘+‘)
                    ans = x1 + x2;
                else if (c == ‘/‘)
                    ans = x2/x1; 
                else if (c == ‘%‘)
                    ans = x2 % x1;
                stack.push(ans);
            }
        }
        return stack.pop();
    }

    private static boolean is_num(char c) {
        if (c >= ‘0‘ && c <= ‘9‘)
            return true;
        return false;
    }
View Code

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

之后是测试样例。。。

技术分享

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

标签:

原文地址:http://www.cnblogs.com/sherlockmoon/p/5248948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!