无名侠 发表于 2015-8-5 13:04:27

表达式计算器

{:4_86:}最近在学习Android平台。 我的目标不仅要学习Android安全,开发也要学。没开发能力怎能称为猿?因为学过中缀后缀表达式相关的算法,以前用C写过,所以实现起来并不是很困难。


表达式求值类:

package cn.calc;

public class Expression {
        char opTable[] = { '+', '-', '*', '/', '(' };
        int leave[] = { 1, 1, 2, 2, 0 };

        public String postfix(String exp) {
                String hexp = "";
                EasyTextStack stack = new EasyTextStack();
                for (int i = 0; i < exp.length(); i++) {
                        char sub;
                        sub = exp.charAt(i);
                        if (Character.isDigit(sub)) {
                                hexp = hexp + sub;
                                continue;
                        }
                        if (sub == '(') {
                                stack.push("(");
                                continue;
                        }
                        if (sub == ')') {
                                while (stack.getTop().equals("(") == false) {
                                        hexp = hexp + " " + stack.pop();
                                }
                                stack.pop();
                                continue;
                        }
                        if (isOp(sub)) {
                                if (stack.isEmpty() == false) {
                                        while (getLeave(sub) <= getLeave(stack.getTop().charAt(0))) {
                                                hexp = hexp + " " + stack.pop();
                                                if (stack.isEmpty())
                                                        break;
                                        }
                                }
                                hexp = hexp + " ";
                                stack.push(Character.toString(sub));
                        }
                }
               
                while (stack.isEmpty() == false) {
                        hexp = hexp + " " + stack.pop();
                }
                return hexp;
        }
        public int postfix_value(String exp) {
                String strGroup[];
                int result=0;
                EasyTextStack stack = new EasyTextStack();
                strGroup = exp.split(" ");
                if(strGroup.length==0)
                {
                        return 0;
                }
                for (int i = 0; i < strGroup.length; i++) {
                        String string = strGroup;
                        if(isOp(string.charAt(0)))
                        {
                                int v1,v2;
                                if(stack.getCount()<2)
                                        return 0;
                                v1= Integer.parseInt(stack.pop());
                                v2 = Integer.parseInt(stack.pop());
                                if(string.equals("-"))
                                {
                                        result = v2-v1;
                                        stack.push(String.format("%d",result));
                                        continue;
                                }
                                if(string.equals("+"))
                                {
                                        result=v1+v2;
                                        stack.push(String.format("%d",result));
                                        continue;
                                }
                                if(string.equals("*"))
                                {
                                        result = v1*v2;
                                        stack.push(String.format("%d", result));
                                        continue;
                                }
                                if(string.equals("/"))
                                {
                                        result = v2/v1;
                                        stack.push(String.format("%d", result));
                                        continue;
                                }
                        }else
                        {
                                stack.push(string); // 数字入栈
                        }
                }
                if(stack.getCount()==1)
                        return Integer.parseInt(stack.pop());
                return 0;
        }

        private boolean isOp(char op) {
                for (int i = 0; i < opTable.length; i++)
                        if (opTable == op)
                                return true;
                return false;
        }
        private int getLeave(char op) {
                for (int i = 0; i < opTable.length; i++)
                        if (opTable == op)
                                return leave;
                return 0;
        }
}


论坛怎么不能上传附件?
**** 本内容需购买 ****

A00 发表于 2015-8-5 13:17:53

支持原创,沙发

听鬼哥说故事 发表于 2015-8-6 09:41:42

赞楼主的分享精神,很给力~

peterdocter 发表于 2015-8-6 09:46:04

多谢分享!楼主网盘有很多宝{:5_117:}

无名侠 发表于 2015-8-6 13:50:31

peterdocter 发表于 2015-8-6 09:46
多谢分享!楼主网盘有很多宝

{:4_87:}的确,但是公开的好像没什么宝~

CRoot 发表于 2015-8-24 19:02:06

学习了 之前写过有个化学元素的计算器 没想到用栈的方式 会方便很多

FindAllBlue 发表于 2015-8-27 20:04:41

美女!{:5_122:}{:5_122:}{:5_122:}{:5_122:}私聊吗

mmpo789 发表于 2015-12-4 21:02:43

本付费内容需要支付 1NB 才能浏览
页: [1]
查看完整版本: 表达式计算器