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));
}
}
分享到:
相关推荐
Java计算器核心算法代码实现 Java计算器核心算法代码实现是指使用Java语言实现计算器核心算法的代码实现。该算法主要包括三个步骤:字符串分割、中缀转后缀和后缀计算。在本文中,我们将详细介绍这三个步骤的实现...
在编程领域,设计和...通过这个"java 计算器算法"项目,开发者不仅可以巩固基础的编程技能,还能深入理解数据结构、算法和异常处理等核心概念。同时,对于初学者来说,这是一个很好的动手实践和学习Java编程的起点。
【标题】"java计算器+报告"揭示了这个项目的核心内容,即一个用Java语言实现的计算器程序,并且包含了相应的项目报告。这表明该程序不仅是一个简单的计算工具,可能还涉及了高级功能,如复杂数学运算、图形界面或者...
房贷计算器的核心在于理解并应用金融数学中的相关算法。首先,我们需要知道房贷计算的基本要素:贷款金额(P),年利率(r),贷款期限(n),以及还款方式(等额本息或等额本金)。这些参数在实际计算中起到关键...
3. **计算器算法**:实现计算器的核心算法是程序的重点。这包括基本的算术运算(加、减、乘、除),以及可能的括号处理、科学计算(如对数、指数、平方根等)。这些算法通常在独立的类或方法中实现,通过调用这些...
本项目“用AWT包实现的JAVA计算器”旨在通过AWT来构建一个功能完备的计算器应用。下面将详细介绍这个项目中的关键知识点。 1. **AWT组件**: - AWT提供了各种基本组件,如按钮(Button)、文本字段(TextField)、...
《JAVA计算器课程设计详解》 在计算机编程领域,设计并实现一个计算器程序是常见的课程设计任务,这有助于学习者深入理解编程语言的基本语法和逻辑控制。在这个Java计算器课程设计报告中,我们将探讨如何构建一个...
Java计算器课程设计报告通常涉及到Java...总的来说,这个Java计算器课程设计不仅锻炼了学生的编程技能,也使他们深入理解了面向对象编程的核心思想,同时也涵盖了软件工程中的设计、实现、测试和文档编写等多个环节。
总的来说,这个Java计算器项目是一个很好的学习资源,它覆盖了基础的Java编程概念,如类、对象、事件处理、GUI设计以及简单的算法应用。无论是对于刚接触Java的新手,还是想要提升GUI编程技巧的开发者,都能从中受益...
【标题】:“java计算器 带有设计方案” 在这个项目中,我们主要探讨的是如何使用Java编程语言实现一个计算器程序,并且附带了完整的设计方案,这对于初学者来说是一份非常有价值的参考资料。Java是一种广泛使用的...
以下是关于这个Java计算器设计报告的详细知识点: 1. **基础架构**:一个Java计算器程序通常包含多个类,如`Calculator`(主计算类)、`Expression`(表达式处理类)和`Operator`(操作符类)。`Calculator`类负责...
首先,让我们来看看“JAVA计算器”项目的整体架构。一个基本的计算器程序通常包括用户界面(UI)和业务逻辑两部分。在Java中,UI可以使用Swing或JavaFX库来构建,而业务逻辑则涉及数学运算和条件判断。 1. **Swing...
Java计算器是一种基于Java编程语言开发的应用程序,通常用于执行基本到复杂的数学运算。在这个特定的案例中,"Java_Caculator.rar"是一个压缩文件,包含了名为"Java计算器"的项目或源代码。这个项目旨在创建一个模拟...
Java简易计算器是一个基于Java编程...总的来说,这个Java简易计算器项目涵盖了基础的数学运算、三角函数、数据结构(栈)、算法(逆波兰表达式转换)以及Java GUI编程等多个知识点,是学习和实践Java编程技能的好例子。
这个Java计算器项目不仅可以让初学者练习基本的编程技巧,还涉及到数据结构(栈)、算法(运算符优先级)、异常处理、用户交互等多个重要概念,对于提升编程能力非常有帮助。通过这个项目,开发者可以深入理解如何将...
- **核心算法描述** - 使用两个栈,一个存储数字(numStack),一个存储运算符(opStack)来实现运算符优先级。 - 当按下运算符按钮时,将当前运算符压入opStack,数值压入numStack。 - 当按下等于号按钮时,...
《基于Java的计算器算法》 本文将详细解析一个基于Java编程语言实现的计算器程序,它具有与Windows附件中标准计算器类似的功能和界面。虽然这个计算器目前不支持键盘操作,但其设计思路和代码结构对于学习Java GUI...
Java计算器源码含界面,基于堆栈算法实现,是一份非常适合初学者进行实践与学习的项目。这个项目的核心是利用栈这种数据结构来处理复杂的计算问题,尤其对于那些涉及运算符优先级和括号的表达式。在此,我们将深入...
总的来说,这个Java计算器课程设计涵盖了多个核心编程概念,包括面向对象设计、GUI编程、数据结构和算法、错误处理以及软件测试。对于初学者来说,这不仅是一个动手实践的好机会,也是巩固理论知识和提升编程技能的...