谈谈JAVA如何计算字符串公式

原创 2015年04月11日 15:59:49

因为最近忙着面试,也没太多时间分享自己的博客,但因为面试的过程中,碰到了几道类似的算法题,都是输入一个字符串数学公式,输出结果。自己整理了下,希望能和大家交流交流。我是利用谭浩强那本C语言上的算法写的,有不合理出,还喜欢大家批评指正。

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

class InfixToSuffix
{
    /**
     * 遍历集合,是数字则入栈,碰到操作符,将数字出站,判断操作符,并执行相应的操作
     * @param suffix
     * @return
     */
    public static int getResult(ArrayList<String> suffix)
    {
        Stack<String> stack = new Stack<String>();
        for(String element_suffix:suffix)
        {
            //如果是数字,入栈
            if(Character.isDigit(element_suffix.charAt(0)))
            {
                stack.push(element_suffix);
            }else{
                //如果遇到运算符,取出元素,并判断操作符,执行相应的计算
                //自动拆箱:将包装类转换成基本类型
                //自动装箱:将基本类型转换成包装类
                int ANumber = Integer.valueOf(stack.pop());//自动拆箱,取出第一个元素
                int BNumber = Integer.valueOf(stack.pop());//自动拆箱,取出第二个元素
                int result = 0;
                switch (element_suffix) {
                case "+":
                    result = ANumber+BNumber;
                    break;
                case "-":
                    result = ANumber-BNumber;
                    break;
                case "*":
                    result = ANumber*BNumber;
                    break;
                case "/":
                    result = ANumber/BNumber;
                    break;
                default:
                    break;
                }
                stack.push(result+"");
            }
        }
        return Integer.valueOf(stack.pop());
    }
    /**
     * 将字符串转成集合
     * @param str 待转的字符串
     * @return 
     */
    public static ArrayList<String> getArrayList(String str)
    {
        ArrayList<String> stringList = new ArrayList<String>();//用于存储字符串集合
        for(char chs:str.toCharArray())
        {
              stringList.add(chs+"");
        }
        System.out.println("将字符串存入集合:"+stringList);
        return stringList;
    }
    /**
     * 比较当前运算符和栈顶运算符的优先级
     * @param stackPeek 栈顶元素
     * @param current 当前元素
     * @return
     */
    public static boolean getPriority(String stackPeek,String current)
    {
        if(stackPeek.matches("[\\*\\/]") && current.matches("[\\+\\-\\*\\/]"))
        {
            return true;
        }else if(stackPeek.matches("[\\+\\-]") && current.matches("\\+\\-"))
        {
            return true;
        }
        return false;
    }
    /**
     * 获得后缀表达式
     * @param infix 传入的中缀表达式的集合
     * @return
     */
    public static ArrayList<String> getSuffix(ArrayList<String> infix)
    {
        ArrayList<String> suffix = new ArrayList<String>();//用于存储最后的后缀式
        Stack<String> operator = new Stack<String>();//用于比较运算符优先级
        //第一步:分离数字和运算符
        for(String chs:infix)
        if(Character.isDigit(chs.charAt(0)))
        {//如果是数字,加入集合
            suffix.add(chs);
        }else{
            //如果不是数字,分离括号和运算符
            switch (chs.charAt(0)) {
            //左括号直接入栈
            case '(':
                operator.push(chs);
                break;
            //右括号,出栈,直到左括号出栈    
            case ')':
                while(!"(".equals(operator.peek()))
                       suffix.add(operator.pop());
                operator.pop();//左括号出栈
                break;
            default:
                //如果是运算符,先比较优先级,如果当前元素的优先级低于栈顶元素,则栈顶元素出栈,当前元素出栈
                //原则是保证栈顶元素的优先级最高
                //如果栈顶元素优先级高,返回true,栈顶元素出栈,直到存在元素优先级低于当前元素
                while(!operator.isEmpty() && getPriority(operator.peek(),chs))
                    suffix.add(operator.pop());
                operator.push(chs);//优先级高的栈顶元素出栈后,加入优先级更低的元素
                break;
            }
        }
        //判断栈中是否还有元素,有的话,取出
        while(!operator.isEmpty())
            suffix.add(operator.pop());
        System.out.println("中缀式是:"+suffix);
        return suffix;
    }
}
//test
public class Demo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = "(2+3)*3+9*6/8+(2+4/3+(2+6/5))";   
            System.out.println(InfixToSuffix.getResult(InfixToSuffix.getSuffix(InfixToSuffix.getArrayList(str))));
    }

}
//result
将字符串存入集合:[(, 2, +, 3, ), *, 3, +, 9, *, 6, /, 8, +, (, 2, +, 4, /, 3, +, (, 2, +, 6, /, 5, ), )]
中缀式是:[2, 3, +, 3, *, 9, 6, *, 8, /, 2, 4, 3, /, 2, 6, 5, /, +, +, +, +, +]
19

java执行字符串中的运算公式

public class runString { static ScriptEngine jse = new ScriptEngineManager().getEngineByName("Java...

可以解析公式的java类实例--可传入数值运算表达式、含变量的运算表达式

前几天遇到一个问题,需要从xml文件里读取一个含参数的公式并调用它。    于是上网找方法,但是实在是没有找到可以解析含参数的公式的方法,于是吸取了一些精华,并在此基础上加以改造,终于实现了,但是这...
  • lucherr
  • lucherr
  • 2012年04月05日 16:16
  • 11586

java字符串数学公式运算

//由于网络限制禁止上传,因此在此提供源码,jar自己进行制作。 /**   pulbic static void main(String[]args){      RunStringReg....

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Java处理数学公式得出结果

支持含有字母的复杂表达式、不含字母的纯数学表达式先上测试程序,后面有源码: 1.纯数字的算式测试 public static void main(String[] args) thro...

java把字符串转化成公式计算

static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); Object aa = jse....

java常用计算公式

主要为double类型计算 package com.xf.utils;import java.math.BigDecimal;public abstract class AmountUtil { ...

jeval-java计算公式工具包

java数学表达式运算包——jevaljeval是为为你的Java应用程序提供可加入的、高性能、数学、 布尔和函数表达式的解析和运算的高级资源包。...
  • dmadboy
  • dmadboy
  • 2016年05月13日 21:41
  • 504

java中的数学计算函数

Math类:   java.lang.Math类中包含基本的数字操作,如指数、对数、平方根和三角函数。   java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈谈JAVA如何计算字符串公式
举报原因:
原因补充:

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