`
啸笑天
  • 浏览: 3435574 次
  • 性别: 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上应用,拥有计算器的基本功能,四则运算是用栈实现的,每一步运行显示都和买的计算器一样——————申明菜鸟版!!

    java实现四则运算

    java实现四则运算,将中缀表达式变成后缀表达式,使用栈来做最后的运算

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

    java简易计算器,能够进行四则运算、三角函数运算,已实现优先级。 将中缀表达式转化成后缀表达式(逆波兰表达式) 主要运用了栈、简单的数学知识,java图形界面设计等相关知识

    四则运算JAVA计算器

    简单的JAVA计算器,能进行四则运算,有 括号,加了栈!

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

    NULL 博文链接:https://chinamobile.iteye.com/blog/1630919

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

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

    四则运算代码

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

    利用堆栈编程实现四则混合运算

    利用堆栈编程实现四则混合运算,说得很详细,短小,挺容易理解的~

    算术四则运算

    一个利用栈实现四则运算的小资源,操作数只能是个位数

    java实现逆波兰式运算

    1.本例是对数据结构栈的练习 2.本例使用了java类集作为辅助,但不是必要,所有功能都可以自己实现 3.本例有输入四则运算的合法性判断方法,是基于逻辑实现,可以使用正则表达式字符匹配,会是代码简洁不少.

    利用值栈求表达式 java

    实现简单的四则运算 支持带括号的 运算!

    计算器.rar

    使用java swing四则运算计算器,使用栈实现表达式运算。

    java基础入门教程

    工 业 界 不 少 人 预 言 :"Java 语 言 的 出 现 ,将 会 引 起 一 场软 件革 命 ",这 是 因 为 传统 的 软 件 往 往 都 是 与 具 体 的 实现 环 境 有 关 ,换 了 一 个 环 境 就需 要 作 一 番 改 动 ,耗时 费 力 ,...

    java设计模式

    27.1 四则运算你会吗 27.2 解释器模式的定义 27.3 解释器模式的应用 27.3.1 解释器模式的优点 27.3.2 解释器模式的缺点 27.3.3 解释器模式使用的场景 27.3.4 解释器模式的注意事项 27.4 最佳实践 第28章 享元模式 ...

    JAVA面试题最全集

    7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    Java实验报告(5).doc

    四、实验结果与数据处理 程序代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class experiment_3{ static int intInputValue; static String ...

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    java课程设计实验报告

    设计GUI界面的计算器程序,用户可以通过鼠标依次输入参加计算的数值进行加、减、乘、除等混合运算功能。可参照windows平台上的计算器。 二、算法基本描述 主要是考虑符号的优先级,然后配对和消除,使用堆栈来处理。...

    Java经典入门教程pdf完整版

    4:除了上面提到的,Java还有很多功能:如进行数学运算、显示图形界面、进行网络操作、 进行数据库操作、进行文件的操作等等。 PDF文件使用&quot; pdfFactory Pro&quot;试用版本创建ww, fineprint,cn Java私塾跟我学...

Global site tag (gtag.js) - Google Analytics