`
qq_24665727
  • 浏览: 121675 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
阅读更多
import java.util.Stack;   
import java.util.regex.Matcher;   
import java.util.regex.Pattern;   
public class Count {   
    // 操作符数组,优先级从低到高   
    private static String[] operas = { "#", "+-", "*/", "%^" };   
    public static String test(String s) {   
        if (null == s)   
            return "";   
        s += "#";   
        Pattern num = Pattern.compile("^(\\d+(\\.\\d+)?)(.*)");   
        Matcher matcher;   
        Stack<String> stack1 = new Stack<String>();   
        Stack<String> stack2 = new Stack<String>();   
        char ch;   
        while (s.length() > 0) {   
            matcher = num.matcher(s);   
            // 判断开头是否是数字   
            if (matcher.find()) {   
                stack2.add(matcher.replaceAll("$1"));   
                s = matcher.replaceAll("$3");   
            } else {   
                ch = s.charAt(0);   
                s = s.substring(1);   
                // //////////   
                // / 优先级 '(' ')'   
                // /////////   
                if ('(' == ch) {   
                    stack1.add("" + ch);   
                    continue;   
                } else if (ch == ')') {   
                	//查看堆栈顶部的对象,但不从堆栈中移除它
                    while (!stack1.isEmpty() && !("(").equals(stack1.peek())) {   
                        stack2.add(calc(stack2.pop(), stack1.pop().charAt(0), stack2.pop()));   
                    }   
                    if (!stack1.isEmpty())   
                        stack1.pop();   
                    continue;   
                }   
                // ////////////   
                // / 计算表达式   
                // ///////////   
                if (isOpea(ch)) {   
                    while (true) {   
                        if (!stack1.isEmpty() && yxj("" + ch, stack1.peek())) {   
                            stack2   
                                    .add(calc(stack2.pop(), stack1.pop().charAt(0), stack2   
                                            .pop()));   
                        } else {   
                            stack1.add("" + ch);   
                            break;   
                        }   
                    }   
                } else {   
                    throw new RuntimeException("表达式非法!!");   
                }   
            }   
        }   
        return stack2.pop();   
    }   
    /**  
     * 判断一个字符是否是操作符  
     *   
     * @param ch  
     *            需要判断的字符  
     * @return 如果是操作符返回 true 否则返回 false  
     */  
    private static boolean isOpea(char ch) {   
        for (String str : operas) {   
            if (str.indexOf(ch) != -1)   
                return true;   
        }   
        return false;   
    }   
    /**  
     * 比较操作符的优先级  
     *   
     * @param str  
     *            第一个操作符  
     * @param str1  
     *            第二个操作符  
     * @return 第一个操作符的优先级高于第二个操作符 返回false 否则返回 true  
     */  
    private static boolean yxj(String str, String str1) {   
        int stack1 = 0, stack2 = 0;   
        for (int i = 0; i < operas.length; i++) {   
            if (operas[i].indexOf(str) > -1) {   
                stack1 = i;   
            }   
            if (operas[i].indexOf(str1) > -1) {   
                stack2 = i;   
            }   
        }   
        return stack2 >= stack1;   
    }   
    /**  
     * 计算  
     *   
     * @param stack1  
     *            操作数1  
     * @param c  
     *            操作符  
     * @param stack2  
     *            操作数2  
     * @return 返回操作数1和操作数2 经过操作符 c 运算后的结果  
     */  
    private static String calc(String stack1, char c, String stack2) {   
        String result = "0";   
        Double d1 = Double.parseDouble(stack1);   
        Double d2 = Double.parseDouble(stack2);   
        switch (c) {   
        case '+':   
            result = "" + (d1 + d2);   
            break;   
        case '-':   
            result = "" + (d2 - d1);   
            break;   
        case '*':   
            result = "" + (d1 * d2);   
            break;   
        case '/':   
            result = "" + (d2 / d1);   
            break;   
        case '%':   
            result = "" + (d2 % d1);   
            break;   
        case '^':   
            result = "" + (Math.pow(d2, d1));   
            break;   
        }   
        return result;   
    }   
    public static void main(String[] args) {   
        System.out.println(test("(1+1+1+1*1*2.5*3)/2-1)"));   
    }   
} 

 也是在别人这里看到的,给大家分享

1
2
分享到:
评论

相关推荐

    MFC用逆波兰算法实现计算器

    MFC用逆波兰表达式算法实现计算器的加、减、乘、除等功能,把计算器完全封装在CMyCalculator类中,并具有很好的扩展性和可移植性。数据类型是CString,并用Vector对数据进行入栈、出栈等操作。

    逆波兰算法实现

    逆波兰算法,也称为后缀表达式或波兰后缀表示法,是一种数学表达式的表示方法,主要用于简化计算过程,特别是用于计算机程序中的算术运算。它通过将操作符置于其操作数之后,消除了对括号的需求,使得计算更为直观和...

    逆波兰算法c++代码

    逆波兰算法,也称为后缀表达式或逆波兰表示法,是一种无括号的数学表达式表示方法。在该表示法中,运算符位于其操作数之后,这使得表达式的计算可以通过栈数据结构来简化。它常用于编译器设计、解析器构建以及计算机...

    逆波兰算法(计算器灵魂算法)

    逆波兰算法,又称后缀表达式算法,是一种基于栈的数据结构来解析和求解数学表达式的方法。它的主要特点是将操作符放在操作数之后,使得表达式求值的过程更为直观和简单。在计算器中,这种算法常用于高效地计算复杂的...

    MFC基于逆波兰算法的四则运算计算器源码打开即运行(vs2008)

    逆波兰算法,又称后缀表达式算法,是一种用于计算表达式的高效方法,它避免了使用括号,并将操作符置于其操作数之后。在MFC(Microsoft Foundation Classes)框架下,我们可以利用C++来实现这样的计算器。MFC是微软...

    C#.NET逆波兰算法求解普通算式(支持自定义运算符)

    用法举例: using System; using System.Collections.Generic; using RPN; namespace CSharp_Console { class Program ... public static void Main(string[] args) ... var rpn = new ReversePolishNotation();...

    编译原理逆波兰算法及四元式

    逆波兰算法,也被称为后缀表达式或波兰后缀算法,是计算机科学中用于解析数学表达式的一种高效方法。在编译原理中,它扮演着重要角色,特别是在构造表达式树和实现求值过程时。这个算法是由波兰数学家雅克什·卢卡西...

    Android 计算器源码之逆波兰算法

    逆波兰算法,也称为后缀表达式算法,是计算表达式的一种有效方法,尤其在编程领域,如Android应用开发中的计算器实现中广泛应用。这个算法的主要优点在于它避免了使用堆栈来处理运算符优先级的问题,使得计算过程...

    基于vs2017开发的逆波兰算法下的计算器控制台程序,可用于数据结构学习练手

    本代码基于vs2017下开发的c++代码,代码主要使用逆波兰算法构建四则运算框架,从而实现计算器程序的构建,此外代码中还加入了三角函数,反三角函数等函数的处理,并且做了表达式的正确性检验,可以作为数据结构以及...

    QT-科学计算器-可视化-逆波兰算法

    在这个项目中,“QT-科学计算器-可视化-逆波兰算法”显然是一个使用QT框架构建的高级计算器应用,它提供了丰富的数学功能,如处理括号表达式、解决二元一次方程、执行指数和对数运算等。 首先,让我们深入了解一下...

    逆波兰算法-java实现

    逆波兰算法,也称为后缀表达式算法,是一种在计算表达式时避免使用括号的算法。它基于栈数据结构,使得表达式求值过程更为直观。在这个Java实现的项目中,用户可以配置自定义表达式,系统会动态计算出结果。 首先,...

    编译原理----------算符优先下的逆波兰算法

    其中,逆波兰算法作为一种特殊的算法,对于编译原理的重要性不言而喻。逆波兰算法,也被称为后缀表达式算法,它的核心思想是将中缀表达式转化为后缀表达式。后缀表达式不需要使用括号来标识操作符的优先级,因此它...

    逆波兰算法实现:Python平台 计算器 demo

    逆波兰算法,也被称为后缀表达式算法,是一种在计算领域广泛应用的算法,主要用于解决表达式的求值问题。它的特点是将运算符放置在操作数之后,这样可以避免使用括号来控制运算顺序,使得表达式的解析和计算变得更加...

    利用Java解释逆波兰算法.zip

    逆波兰算法,也称为后缀表达式或逆波兰表示法,是一种无括号的数学表达式表示方式,它通过将运算符放在操作数之后来消除运算优先级的困扰。这种算法在计算机科学中广泛用于表达式求值,因为它简化了计算过程。在Java...

    C++实现一个经典计算器(逆波兰算法)源码

    这里使用逆波兰算法,能够根据当前用户输入的算式表达式字符串,计算出所要的结果,算式字符串可以包括加、减、乘、除和括号,支持整数、小数,鼠标和键盘均可操作,实现了一个较为经典的计算器功能。后期如果有时间...

    C++实现一个经典计算器(逆波兰算法)源码vc6.0

    这里使用逆波兰算法,能够根据当前用户输入的算式表达式字符串,计算出所要的结果,算式字符串可以包括加、减、乘、除和括号,支持整数、小数,鼠标和键盘均可操作,实现了一个较为经典的计算器功能。后期如果有时间...

    表达式求值(逆波兰算法,javascript实现)

    表达式求值(逆波兰算法,javascript实现)

    基于逆波兰表达式的计算程序

    逆波兰表达式,又称后缀表达式,是一种用于表示数学计算的符号表示法。它将操作符放在操作数之后,避免了使用括号,简化了运算过程。在基于逆波兰表达式的计算程序中,通常包括以下几个核心知识点: 1. **逆波兰...

    简单的控制台版逆波兰计算器

    这是我在大一下学期结束时做的课程设计,能力有限,是控制台版的 代码看起来有点不伦不类,是因为要求用c++写,我先用c写的,然后改了下头文件和函数,但是完全可以用 当时是用的vs2010编译的,有些代码可能不通用。...

    用逆波兰算法实现的c#脚本解析源代码及说明文档(已经商用)

    利用逆波兰算法实现脚本的解析和计算,支持abs、acos、asin等19种工业常用函数,支持外部变量引用(可以实现强大的扩展功能,规则见文档),已经在商业软件上成功应用。请用VS2017及以上版本打开。

Global site tag (gtag.js) - Google Analytics