`

java计算器的核心算法

阅读更多
oneday做了计算器的界面,网上搜了下算法,但是搜不到具体的java代码,闲来无事,写了个,欢迎大家来喷!
* @author superGenius吴大仙^^!蛋疼仔
* 计算器算法的实现
   *定义两个堆栈,一个放置操作数,一个放置操作符
   *1.首先把得到的数学表达式转化成为逆波兰式 Reverse Polish Notation
   *  对于一个表达式,遇到数字便+入到新的逆波兰式,假如遇到的是操作符,首先比较其和操作符堆栈里面
   *  操作符的优先级,假如优先级较高,便加入到操作符堆栈中,or+入到逆波兰式中
   * 2.计算逆波兰式
   * 遍历波兰式,遇到数字便放入堆栈,遇到操作符,操作数堆栈弹出,执行相应的操作符操作,util...then ok;

import java.util.HashMap;
import java.util.Map;

import java.util.Stack;



public class CalculatorIn {
    private Stack<Double> operandStack=new Stack<Double>();//操作数堆栈
    private Stack<String> operatorStack=new Stack<String>();//操作符堆栈
    private String expression;//算数表达式
    private double result=0.0;//计算结果
    private Map<String,Integer> priorityMap=new HashMap<String,Integer>();//用于存储操作符优先级的Map
    //初始化优先级约定(可根据计算的复杂程度扩展)
    public CalculatorIn()
    {
        priorityMap.put("+",0);
        priorityMap.put("-",0);
        priorityMap.put("*", 1);
        priorityMap.put("/", 1);
       
    }
   
    public int getPriority(String op)//得到一个操作符的优先级
    {
        return priorityMap.get(op);
    }
   
    public boolean highPriority(String op)//判断操作符的优先级在堆栈里面是否最为高
    {
        int opPri=getPriority(op);//当前操作符的优先级
        if(!operatorStack.empty())
        {
        for(String s:operatorStack)
        {
            int priority=getPriority(s);
            if(opPri<priority)
                return false;
           
        }
        }
        return true;
    }
    //把表达式转化成逆波兰式
    public String expToIpn()
    {
        int index=0;
        int end=0;
        String Ipn="";
        for(int i=0;i<expression.length();i++)
        {
            String temps=String.valueOf(expression.charAt(i));
            if(temps.matches("[0-9.]"))//检查是否是数字
            {
                end++;
            }
            else
            {
                String tempOperand=expression.substring(index,end);//得到操作数
                Ipn+=tempOperand+",";
                String tempOperator=expression.substring(end,++end);//得到操作符
                if(tempOperator.equals("!"))//假如到表达式的最后将操作符 全部弹出
                    {
                    while(!operatorStack.empty())
                    {
                         Ipn+=operatorStack.pop()+",";
                     }
                    }
                 else
                 {
                if(highPriority(tempOperator))//优先级高的压入操作符堆栈
                    {
                    operatorStack.push(tempOperator);
                    }
                 else
                    {
                     while(!operatorStack.empty())//
                    {
                         Ipn+=operatorStack.pop()+",";
                     }
                    
                     operatorStack.push(tempOperator);
                    }
                //System.out.println(tempOperand+","+tempOperator);
                index=end;
            }
            }
           
        }
        return Ipn;
   
    }
    public double calculateIpn(String[] Ipn)//计算逆波兰式
    {
         
        for(int i=0;i<Ipn.length;i++)
        {
        //    System.out.println(Ipn[i]);
            if(Ipn[i].matches("^[0-9]+.?[0-9]*$"))//正则表达式判断是数字
            {
                operandStack.push(Double.parseDouble(Ipn[i]));
            }
                else
                {
                    popOperand(Ipn[i]);
                }
        }
        return result;
       
    }
    //遇到操作符时,弹出操作数,进行相应操作,并保村result
    public void popOperand(String operator)
    {
        double d1=operandStack.pop();
        double d2=operandStack.pop();
        System.out.println(d1+operator+d2);
        if(operator.equals("+"))
            result=d2+d1;
        if(operator.equals("-"))
            result=d2-d1;
        if(operator.equals("*"))
            result=d2*d1;
        if(operator.equals("/"))
            result=d2/d1;
//System.out.println(result);
            operandStack.push(result);
       
    }

    public Stack getOperandStack() {
        return operandStack;
    }
    public void setOperandStack(Stack operandStack) {
        this.operandStack = operandStack;
    }
    public Stack getOperatorStack() {
        return operatorStack;
    }
    public void setOperatorStack(Stack operatorStack) {
        this.operatorStack = operatorStack;
    }
    public String getexpression_r() {
        return expression;
    }
    public void setexpression_r(String expression) {
        this.expression = expression;
    }
    public double getResult() {
        return result;
    }
    public void setResult(double result) {
        this.result = result;
    }

    public static void main(String[] args)
    {
        CalculatorIn cal=new CalculatorIn();
        String exp="32+1*2*2/2*2-2/2!";
        cal.setexpression_r(exp);
        String[] Ipn=cal.expToIpn().split(",");
         for(int i=0;i<Ipn.length;i++)
        System.out.println(Ipn[i]);
        System.out.println(cal.calculateIpn(Ipn));
    }


}
分享到:
评论
1 楼 lqvc2011 2013-12-16  
这个代码有时会出错,范例3×9-9-2×9,,lz可以解释一下吗

相关推荐

    Java计算器核心算法代码实现

    Java计算器核心算法代码实现 Java计算器核心算法代码实现是指使用Java语言实现计算器核心算法的代码实现。该算法主要包括三个步骤:字符串分割、中缀转后缀和后缀计算。在本文中,我们将详细介绍这三个步骤的实现...

    java 计算器算法

    在编程领域,设计和...通过这个"java 计算器算法"项目,开发者不仅可以巩固基础的编程技能,还能深入理解数据结构、算法和异常处理等核心概念。同时,对于初学者来说,这是一个很好的动手实践和学习Java编程的起点。

    最全房贷计算器 java 代码 含算法

    房贷计算器的核心在于理解并应用金融数学中的相关算法。首先,我们需要知道房贷计算的基本要素:贷款金额(P),年利率(r),贷款期限(n),以及还款方式(等额本息或等额本金)。这些参数在实际计算中起到关键...

    java计算器+报告

    【标题】"java计算器+报告"揭示了这个项目的核心内容,即一个用Java语言实现的计算器程序,并且包含了相应的项目报告。这表明该程序不仅是一个简单的计算工具,可能还涉及了高级功能,如复杂数学运算、图形界面或者...

    Java计算器(包括源码)

    3. **计算器算法**:实现计算器的核心算法是程序的重点。这包括基本的算术运算(加、减、乘、除),以及可能的括号处理、科学计算(如对数、指数、平方根等)。这些算法通常在独立的类或方法中实现,通过调用这些...

    用AWT包实现的JAVA计算器

    本项目“用AWT包实现的JAVA计算器”旨在通过AWT来构建一个功能完备的计算器应用。下面将详细介绍这个项目中的关键知识点。 1. **AWT组件**: - AWT提供了各种基本组件,如按钮(Button)、文本字段(TextField)、...

    JAVA计算器 课程设计报告

    《JAVA计算器课程设计详解》 在计算机编程领域,设计并实现一个计算器程序是常见的课程设计任务,这有助于学习者深入理解编程语言的基本语法和逻辑控制。在这个Java计算器课程设计报告中,我们将探讨如何构建一个...

    java计算器课程设计报告

    Java计算器课程设计报告通常涉及到Java...总的来说,这个Java计算器课程设计不仅锻炼了学生的编程技能,也使他们深入理解了面向对象编程的核心思想,同时也涵盖了软件工程中的设计、实现、测试和文档编写等多个环节。

    Java计算器 Java计算器

    总的来说,这个Java计算器项目是一个很好的学习资源,它覆盖了基础的Java编程概念,如类、对象、事件处理、GUI设计以及简单的算法应用。无论是对于刚接触Java的新手,还是想要提升GUI编程技巧的开发者,都能从中受益...

    java计算器 带有设计方案

    【标题】:“java计算器 带有设计方案” 在这个项目中,我们主要探讨的是如何使用Java编程语言实现一个计算器程序,并且附带了完整的设计方案,这对于初学者来说是一份非常有价值的参考资料。Java是一种广泛使用的...

    java计算器设计报告

    以下是关于这个Java计算器设计报告的详细知识点: 1. **基础架构**:一个Java计算器程序通常包含多个类,如`Calculator`(主计算类)、`Expression`(表达式处理类)和`Operator`(操作符类)。`Calculator`类负责...

    JAVA计算器(适合新手学习)

    首先,让我们来看看“JAVA计算器”项目的整体架构。一个基本的计算器程序通常包括用户界面(UI)和业务逻辑两部分。在Java中,UI可以使用Swing或JavaFX库来构建,而业务逻辑则涉及数学运算和条件判断。 1. **Swing...

    Java_Caculator.rar_Java科学计算器_java计算器_科学计算器_计算器java

    Java计算器是一种基于Java编程语言开发的应用程序,通常用于执行基本到复杂的数学运算。在这个特定的案例中,"Java_Caculator.rar"是一个压缩文件,包含了名为"Java计算器"的项目或源代码。这个项目旨在创建一个模拟...

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

    Java简易计算器是一个基于Java编程...总的来说,这个Java简易计算器项目涵盖了基础的数学运算、三角函数、数据结构(栈)、算法(逆波兰表达式转换)以及Java GUI编程等多个知识点,是学习和实践Java编程技能的好例子。

    java计算器

    这个Java计算器项目不仅可以让初学者练习基本的编程技巧,还涉及到数据结构(栈)、算法(运算符优先级)、异常处理、用户交互等多个重要概念,对于提升编程能力非常有帮助。通过这个项目,开发者可以深入理解如何将...

    Java综合程序设计-计算器-实验报告

    - **核心算法描述** - 使用两个栈,一个存储数字(numStack),一个存储运算符(opStack)来实现运算符优先级。 - 当按下运算符按钮时,将当前运算符压入opStack,数值压入numStack。 - 当按下等于号按钮时,...

    基于Java的计算器算法(源代码).pdf

    《基于Java的计算器算法》 本文将详细解析一个基于Java编程语言实现的计算器程序,它具有与Windows附件中标准计算器类似的功能和界面。虽然这个计算器目前不支持键盘操作,但其设计思路和代码结构对于学习Java GUI...

    Java计算器源码含界面(基于堆栈算法实现)

    Java计算器源码含界面,基于堆栈算法实现,是一份非常适合初学者进行实践与学习的项目。这个项目的核心是利用栈这种数据结构来处理复杂的计算问题,尤其对于那些涉及运算符优先级和括号的表达式。在此,我们将深入...

    Java计算器课程设计

    总的来说,这个Java计算器课程设计涵盖了多个核心编程概念,包括面向对象设计、GUI编程、数据结构和算法、错误处理以及软件测试。对于初学者来说,这不仅是一个动手实践的好机会,也是巩固理论知识和提升编程技能的...

Global site tag (gtag.js) - Google Analytics