`
啸笑天
  • 浏览: 3466305 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

java 四则运算 栈的实现

阅读更多

 

import java.util.Stack;
/**  
 * 利用栈,进行四则运算的类  
 * 用两个栈来实现算符优先,一个栈用来保存需要计算的数据numStack,一个用来保存计算优先符priStack  
 *   
 * 基本算法实现思路为:用当前取得的运算符与priStack栈顶运算符比较优先级:若高于,则因为会先运算,放入栈顶;  
 * 若等于,因为出现在后面,所以会后计算,所以栈顶元素出栈,取出操作数运算;  
 *  若小于,则同理,取出栈顶元素运算,将结果入操作数栈。各个优先级'(' > '*' = '/' > '+' = '-' > ')'  
 *   
 */    
public class Operate {    
    private Stack<Character> priStack = new Stack<Character>();// 操作符栈    
    private Stack<Integer> numStack = new Stack<Integer>();;// 操作数栈    
    
    /**  
     * 传入需要解析的字符串,返回计算结果(此处因为时间问题,省略合法性验证)  
     * @param str 需要进行技术的表达式  
     * @return 计算结果  
     */    
    public int caculate(String str) {    
        // 1.判断string当中有没有非法字符    
        String temp;// 用来临时存放读取的字符    
        // 2.循环开始解析字符串,当字符串解析完,且符号栈为空时,则计算完成    
        StringBuffer tempNum = new StringBuffer();// 用来临时存放数字字符串(当为多位数时)    
        StringBuffer string = new StringBuffer().append(str);// 用来保存,提高效率    
    
        while (string.length() != 0) {    
            temp = string.substring(0, 1);    
            string.delete(0, 1);    
            // 判断temp,当temp为操作符时    
            if (!isNum(temp)) {    
                // 1.此时的tempNum内即为需要操作的数,取出数,压栈,并且清空tempNum    
                if (!"".equals(tempNum.toString())) {    
                    // 当表达式的第一个符号为括号    
                    int num = Integer.parseInt(tempNum.toString());    
                    numStack.push(num);
                    tempNum.delete(0, tempNum.length());    
                }    
                // 用当前取得的运算符与栈顶运算符比较优先级:若高于,则因为会先运算,放入栈顶;若等于,因为出现在后面,所以会后计算,所以栈顶元素出栈,取出操作数运算;    
                // 若小于,则同理,取出栈顶元素运算,将结果入操作数栈。    
    
                // 判断当前运算符与栈顶元素优先级,取出元素,进行计算(因为优先级可能小于栈顶元素,还小于第二个元素等等,需要用循环判断)    
                while (!compare(temp.charAt(0)) && (!priStack.empty())) { 
                    int a = (int) numStack.pop();// 第二个运算数    
                    int b = (int) numStack.pop();// 第一个运算数    
                    char ope = priStack.pop();    
                    int result = 0;// 运算结果    
                    switch (ope) {    
                    // 如果是加号或者减号,则    
                    case '+':    
                        result = b + a;    
                        // 将操作结果放入操作数栈    
                        numStack.push(result);    
                        break;    
                    case '-':    
                        result = b - a;    
                        // 将操作结果放入操作数栈    
                        numStack.push(result);    
                        break;    
                    case '*':    
                        result = b * a;    
                        // 将操作结果放入操作数栈    
                        numStack.push(result);    
                        break;    
                    case '/':    
                        result = b / a;// 将操作结果放入操作数栈    
                        numStack.push(result);    
                        break;    
                    }    
    
                }    
                // 判断当前运算符与栈顶元素优先级, 如果高,或者低于平,计算完后,将当前操作符号,放入操作符栈    
                if (temp.charAt(0) != '#') {    
                    priStack.push(new Character(temp.charAt(0)));    
                    if (temp.charAt(0) == ')') {// 当栈顶为'(',而当前元素为')'时,则是括号内以算完,去掉括号    
                        priStack.pop();    
                        priStack.pop();    
                    }    
                }    
            } else    
                // 当为非操作符时(数字)    
                tempNum = tempNum.append(temp);// 将读到的这一位数接到以读出的数后(当不是个位数的时候)    
        }    
        return numStack.pop();    
    }    
    
    /**  
     * 判断传入的字符是不是0-9的数字  
     *   
     * @param str  
     *            传入的字符串  
     * @return  
     */    
    private boolean isNum(String temp) {    
        return temp.matches("[0-9]");    
    }    
    
    /**  
     * 比较当前操作符与栈顶元素操作符优先级,如果比栈顶元素优先级高,则返回true,否则返回false  
     *   
     * @param str 需要进行比较的字符  
     * @return 比较结果 true代表比栈顶元素优先级高,false代表比栈顶元素优先级低  
     */    
    private boolean compare(char str) {    
        if (priStack.empty()) {    
            // 当为空时,显然 当前优先级最低,返回高    
            return true;    
        }    
        char last = (char) priStack.lastElement();    
        // 如果栈顶为'('显然,优先级最低,')'不可能为栈顶。    
        if (last == '(') {    
            return true;    
        }    
        switch (str) {    
        case '#':    
            return false;// 结束符    
        case '(':    
            // '('优先级最高,显然返回true    
            return true;    
        case ')':    
            // ')'优先级最低,    
            return false;    
        case '*': {    
            // '*/'优先级只比'+-'高    
            if (last == '+' || last == '-')    
                return true;    
            else    
                return false;    
        }    
        case '/': {    
            if (last == '+' || last == '-')    
                return true;    
            else    
                return false;    
        }    
            // '+-'为最低,一直返回false    
        case '+':    
            return false;    
        case '-':    
            return false;    
        }    
        return true;    
    }    
    
    public static void main(String args[]) {    
        Operate operate = new Operate();    
        int t = operate.caculate("(3+4*(4*10-10/2)#");      
        System.out.println(t);    
    }    
    
}    
 

 

6
1
分享到:
评论
4 楼 鱼的地盘 2015-04-17  
带小数的都算不出来。。。。。。
3 楼 啸笑天 2011-12-29  
yb_k 写道
lz,貌似去掉 # 计算不出最后值

代码中 #是结束符
2 楼 yb_k 2011-10-31  
lz,貌似去掉 # 计算不出最后值
1 楼 cloverprince 2011-07-17  
用Deque和LinkedList吧。

相关推荐

    j# java计算器 四则运算 栈

    【标题】"j# java计算器 四则运算 栈"所涉及的知识点主要集中在编程语言J#、计算器软件开发以及数据结构中的栈。这个项目是一个简单的计算器程序,它使用了J#这一微软推出的.NET框架下的Java方言来实现,同时具备...

    java实现四则运算

    在本主题中,我们将深入探讨如何使用Java实现四则运算,包括中缀表达式到后缀表达式的转换以及利用栈数据结构进行计算。 首先,我们要理解四则运算的基本概念,它们包括加法(+)、减法(-)、乘法(*)和除法(/)...

    java简易计算器(四则运算、三角函数、实现优先级)

    Java简易计算器是一个基于Java编程语言实现的计算工具,它不仅支持基本的四则运算,还具备处理三角函数的能力,并且已经实现了运算的优先级规则。这个项目的核心是将用户输入的中缀表达式(常见的数学表达式形式)...

    简单的JAVA四则运算

    #### 一、Java四则运算基础 在计算机编程中,四则运算是最基本的数学运算之一,主要包括加法(`+`)、减法(`-`)、乘法(`*`)与除法(`/`)。对于Java这样的面向对象语言而言,实现四则运算不仅涉及到基本的数据类型操作,...

    java 四则运算计算器

    ### Java四则运算计算器知识点详解 #### 一、项目概述 **标题与描述解析:**“Java四则运算计算器”是一款基于Java语言开发的计算器应用,能够执行加、减、乘、除等基本算术运算,并支持混合运算,具备友好的用户...

    栈的四则运算测试代码

    栈是一种常见的数据结构,它遵循“后进先出”(LIFO)的原则,常用于处理一系列操作,如四则运算。在计算机科学中,栈在算法实现、编译器设计和许多其他领域都有广泛的应用。四则运算,即加法、减法、乘法和除法,是...

    用栈实现数字的四则运算

    例如,`四则运算 (2).c`可能就是一个C语言版本的实现,其中包含解析表达式、处理运算符优先级和栈操作的函数。 总的来说,通过巧妙地运用栈的数据结构,我们可以有效地解决四则运算的问题,尤其是对于复杂表达式的...

    java控制台四则运算计算程序源码

    Java控制台四则运算计算程序源码是一种基于Java编程语言实现的简单计算器,它能够处理任意长度的符合四则运算规则的数学表达式。在控制台上进行交互式操作,用户可以输入数学公式,程序会进行解析并计算出结果。这个...

    Java利用堆栈实现简单四则运算

    本文将详细介绍如何利用Java的堆栈数据结构来实现简单的四则运算。 四则运算,即加法(+)、减法(-)、乘法(*)和除法(/),是我们日常计算中最基本的操作。在计算机程序中,这些运算通常用于处理数学表达式。...

    四则运算解析器(字符串)

    在实现四则运算解析器时,可以采用递归下降解析(Recursive Descent Parsing)或者堆栈解析(Shunting Yard Algorithm,也称逆波兰表示法)等方法。递归下降解析器直接使用函数来表示文法规则,适合处理简单的表达式...

    四则运算JAVA计算器

    该项目是一个基于Java Swing的简单计算器应用程序,能够实现基本的四则运算功能,并且支持括号操作,以解决优先级问题。为了处理复杂的数学表达式,该计算器还引入了栈的概念。 #### 二、项目结构与组件分析 1. **...

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

    "java实现字符串四则运算公式解析工具类的方法" 今天小编将为大家分享java实现字符串四则运算公式解析工具类的方法,这个工具类能够帮助用户快速解析和计算字符串形式的四则运算公式。这个工具类被命名为...

    运用栈实现四则运算2

    在本主题“运用栈实现四则运算2”中,我们将深入探讨如何使用顺序栈来解决数学表达式的计算问题。顺序栈是栈的一种实现方式,其中元素存储在连续的内存空间中,便于快速访问。 首先,我们来看看四个关键的栈操作: ...

    基于SLR文法的整数加减乘除四则运算

    在这个“基于SLR文法的整数加减乘除四则运算”项目中,我们主要关注的是如何用SLR方法解析和执行基本的算术表达式,即整数之间的加、减、乘、除操作。这通常涉及到以下步骤: 1. **文法定义**:首先,我们需要定义...

    java编写计算器,可用于二十位以上整数的四则运算

    在Java编程语言中,开发一个可以处理二十位以上整数的四则运算计算器是一项具有挑战性的任务,因为标准的`int`和`long`数据类型无法存储这么大的数值。为了解决这个问题,我们需要使用`BigInteger`类,它属于Java的...

    四则运算表达式计算器

    四则运算表达式计算器可以用多种编程语言实现,如Python、Java、C++、JavaScript等,每种语言都有其特有的数据结构和语法来支持这种计算。 通过以上步骤,我们可以创建一个能够处理任意长度四则运算表达式的计算器...

    java编写一个类,该类可以进行加、减、乘、除四则运算,并且输出运算结果

    (1)编写一个类,该类可以进行加、减、乘、除四则运算,并且可以输出运算结果。此外,对于除法,如果被除数为0,该类可以报错。对于加、减、乘、除之外的运算符,该类应该告知无法处理。 (2)编写一个包含主方法...

    四则运算代码

    java写的一个四则运算方式,使用栈实现,支持+-×/()^等操作,非常容易扩展其他操作符。只需在表格中添加并在switch中增加case语句就可以。 代码比较容易修改为C++的代码。

Global site tag (gtag.js) - Google Analytics