用java实现计算String类型的四则运算——用栈和后缀表达式实现

原创 2015年11月18日 23:15:26
最近看数据结构,看到栈和后缀表达式的地方,于是自己动手用写了一段很简单的实现计算String类型的四则运算的例子。
思路:给一个String类型的算术计算式,求这个String算数式的值。计算String串的值,涉及到一个主要问题:加减乘除及括号的优先级该怎么解决。于是后缀表达式就华丽丽的登场了,它涉及到的数据结构是栈,然后利用后缀表达式计算。
首先中缀转后缀:运算时从左向右开始,1)如果是数字直接输出;2)如果是'(',则直接入栈;3)如果是运算符,先与栈顶元素比较优先级,优先级大于或等于栈顶元素直接入栈,小于栈顶元素优先级则栈顶元素先出栈,之后再与栈顶元素优先级比较,重复3)规则;4)如果是')',则将栈中元素持续出栈,直到'('元素出栈,然后继续按规则1、2、3、4执行。比如9+(3-1)*3-10/2中缀表达式转完后缀表达式为:9 3 1 - 3 * 10 2 / - +
中缀转弯后缀表达式之后就该计算了,将后缀表达式依次入栈,数字直接入栈,运算符不入栈,有运算符时连续弹出2个元素计算后将结果入栈。比如上面的后缀表达式,9先入栈,之后3入栈,之后1入栈,之后为‘-’,则不入栈,先将栈顶的1取出作为被减数(位置要正确,先取出的元素位于运算符右侧),再将3取出作为减数,结果为2,然后将2入栈,按规则一步一步来即可得到结果。下面是我这段时间写的一个小程序,暂时只能运算整数的四则运算,之后有时间了我会慢慢完善。

class D1 implements Serializable {
    public static void main(String[] args) {
        //这里做测试
        D1 d = new D1();
        String str = "9+(3-1)*3-10/2";
        List<String> list = d.infixToSuffix(str);
        Integer num = d.getReslut(list);
        System.out.println(num);
    }

    /**
     * 传入转换完毕的后缀表达式,计算
     * @param list
     * @return
     */
    public Integer getReslut(List<String> list){
        Integer n1 = null;
        Integer n2 = null;
        Integer reslut = null;
        Deque<Integer> opt = new LinkedList<Integer>();
        for(int i=0;i<list.size();i++){
            String num = list.get(i);
            try {
                Integer n = Integer.valueOf(num);
                opt.offerFirst(n);
            }catch (Exception e){
                n2 = opt.pollFirst();
                n1 = opt.pollFirst();
                if("+".equals(num)){
                    reslut = n1 + n2;
                }else if("-".equals(num)){
                    reslut = n1 - n2;
                }else if("*".equals(num)){
                    reslut = n1 * n2;
                }else if("/".equals(num)){
                    reslut = n1 / n2;
                }
                opt.offerFirst(reslut);
            }
        }

        return  opt.pollFirst();
    }




    //9+(3-1)*3-10/2 = 10
    //  9 3 1 - 3 * 10 2 / - +
    /**
     * 中缀表达式转后缀表达式,直接传入算数式
     * @param str
     * @return
     */
    public List<String> infixToSuffix(String str) {
        List<String> numlist = getNums(str);
        List<String> list = new ArrayList<String>();
        Deque<String> deque = new LinkedList<String>();
        for (int i = 0; i < numlist.size(); i++) {
//            Character c = str.charAt(i);
            String num = numlist.get(i);
            if("(".equals(num)||"*".equals(num)||"/".equals(num)){
                deque.offerFirst(num);
            }else if("+".equals(num)||"-".equals(num)){
                addAndMul(deque, num, list);
            }else if(")".equals(num)){
                rightKuo(deque, num, list);
            }else{
                list.add(num);
            }
            if (i == numlist.size() - 1) {
                while (true) {
                    String next = deque.pollFirst();
                    if (null == next) {
                        break;
                    }
                    list.add(next);
                }
            }
        }
        return list;
    }

    private void addAndMul(Deque<String> deque, String c, List<String> list) {
        while (true) {
            String    next = deque.peekFirst();
            if (null == next || "+".equals(next) || "-".equals(next) || "(".equals(next)) {
                deque.offerFirst(c);
                break;
            }
            list.add(deque.pollFirst());
        }
    }
    private void rightKuo(Deque<String> deque, String c, List<String> list) {
        while (true) {
            String next = deque.pollFirst();
            if ("(" .equals(next)) {
                break;
            }
            list.add(next.toString());
        }
    }
    /**
     * 将String类型算数表达式转换为list,将数字与运算符分开
     * @param str
     * @return
     */
    private List<String> getNums(String str) {
        String nums = "0123456789";
        String opts = "()+-*/";
//        String[] ss = new String[str.length()];
        List<String> list = new ArrayList<String>();
        int j = 0;
        for (int i = 0; i < str.length(); i++) {
            if (i == 0) {
//                ss[j] = str.substring(i, i + 1);
                list.add(str.substring(i, i + 1));
            } else {
                String per = str.substring(i - 1, i);
                String now = str.substring(i, i + 1);
                if(opts.indexOf(now)>-1 ){
                    j++;
//                    ss[j] = now;
                    list.add(now);
                }else if(nums.indexOf(now)>-1){
                    if(nums.indexOf(per)>-1){
//                        ss[j]=ss[j]+now;
                        list.set(j,list.get(j)+now);
                    }else{
                        j++;
//                        ss[j] = now;
                        list.add(now);
                    }
                }
            }
        }
        return list;
    }
}

以上就是这个的应用了,不想自己写栈了,于是就用了java自带的双端队列,只是使用了其中的栈的功能,其中不完善的地方之后再改了,现在就先到这里了。关于栈和后缀表达式建议直接百度,我也是正在学习中,关于这个可能写的不是很清楚。

Java四则运算表达式求解

字符串表达式四则运算
  • u010893129
  • u010893129
  • 2014年05月08日 10:14
  • 1124

Java字符串转运算、条件表达式

使用JDK6的新特性:脚本语言支持(Scripting):ScriptEngineManager public static void main(String[] args) throws...
  • wudiyong22
  • wudiyong22
  • 2018年01月15日 11:33
  • 61

java运算四则运算表达式的程序

  • 2014年07月10日 18:23
  • 14KB
  • 下载

在Java中计算四则运算表达式字符串的值

原文链接:http://zywang.iteye.com/blog/462797 在项目中有个需求,需要动态的计算一个四则运算表达式的结果,在JS中做这个非常方便,用eval表达...
  • zhangbest2009
  • zhangbest2009
  • 2015年05月13日 17:34
  • 2684

JAVA实现字符串四则运算

JAVA实现输入字符串四则运算表达式(不带括号)输出字符串结果
  • H992109898
  • H992109898
  • 2016年11月03日 21:19
  • 1885

用java实现计算String类型的四则运算——用栈和后缀表达式实现

用java实现计算String类型的四则运算——用栈和后缀表达式实现最近看数据结构,看到栈和后缀表达式的地方,于是自己动手用写了一段很简单的实现计算String类型的四则运算的例子。 思路:给一个St...
  • oqqLai123456
  • oqqLai123456
  • 2015年11月18日 23:15
  • 663

java中用String类型进行计算

java中用String类型进行计算在Java中如果要用String类型进行计算的话需要先转换成int型,再进行计算。用到:String.valueOfInteger.valueOf举例:psr.se...
  • myfxx
  • myfxx
  • 2014年01月14日 16:23
  • 1287

用栈实现四则运算表达式(c++)

水平有限,花了两个小时实现了用栈进行基本的四则运算,只针对整数的运算。(即使两个整数相除也将得到整数)思路:将输入的中缀表达式用栈转化为后缀表达式,再根据后缀表达式用栈实现运算。中缀表达式:运算符位于...
  • scuisdccch
  • scuisdccch
  • 2015年09月29日 09:55
  • 2460

【数据结构】用栈实现对后缀表达式的计算

首先提一句,我所用的IDE是VS2013。编译器不同,所支持的特性也就不同; 现在的C++已经发展到C++11版本,因此VS2008基本就不支持C++11新的特性; 我们用后缀表达式,利用数据...
  • qq_31828515
  • qq_31828515
  • 2016年11月27日 17:12
  • 1064

java实现字符串四则运算公式解析工具类

项目中用到用户定义运算公式进行就算的需求,这样需要进行字符串四则运算解析,下面提供字符串公式四则运算解析与计算工具类,需要的同学可参考。工具类如下:FormulaCalculator.java: p...
  • zmx729618
  • zmx729618
  • 2016年08月26日 15:01
  • 3447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用java实现计算String类型的四则运算——用栈和后缀表达式实现
举报原因:
原因补充:

(最多只允许输入30个字)