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));
}
}
分享到:
相关推荐
des 算法计算器 des 算法计算器des 算法计算器 des 算法计算器
"C#计算器(算法十分简单)"这个标题暗示我们将会看到一个简洁、易于理解的实现,可能采用了不同的设计方法。让我们一起探索其背后的算法和实现细节。 首先,我们需要了解C#的基本语法,这包括变量声明、条件语句、...
在本项目中,“数据结构与算法课程设计计算器实现”是一个基于数据结构和算法的实践项目,目的是帮助学生理解和应用这些核心计算机科学概念。这个计算器的实现主要涉及到了栈这一数据结构,以及相关的算法来处理计算...
一个比较好的Java写的计算器代码! /** * 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。 */ public class Calculator extends JFrame implements ActionListener {
Java计算器核心算法代码实现 Java计算器核心算法代码实现是指使用Java语言实现计算器核心算法的代码实现。该算法主要包括三个步骤:字符串分割、中缀转后缀和后缀计算。在本文中,我们将详细介绍这三个步骤的实现...
基于Android平台的简单计算器,上面的计算器的基本算fa
在本文件中,通过使用C++编程语言,实现了一个基于栈的计算器。该计算器采用两个栈,一个用于存储数字,另一个用于存储运算符。具体的实现细节如下: 知识点1:栈(Stack)的基本概念 栈是一种先进后出(FILO, ...
逆波兰算法,也称为后缀表达式算法,是计算表达式的一种有效方法,尤其在编程领域,如Android应用开发中的计算器实现中广泛应用。这个算法的主要优点在于它避免了使用堆栈来处理运算符优先级的问题,使得计算过程...
微信小程序实现的简易计算器,可以实现简单的运算(包括:加减乘除、平方根等) 微信小程序实现的简易计算器,可以实现简单的运算(包括:加减乘除、平方根等) 微信小程序实现的简易计算器,可以实现简单的运算...
堆栈 科学计算器 笔记
虽然描述为空,但我们可以推断博主可能分享了一篇关于如何编写这样一个计算器程序的文章。通过博文链接(由于无法直接访问,以下内容基于常规计算器算法的构建),我们可以假设文章会涵盖以下几个方面: 1. **...
在Java编程语言中实现一个简易计算器是一项常见的学习任务,它能帮助初学者更好地理解面向对象编程的概念、控制流程以及输入/输出操作。下面我们将详细探讨如何实现这样的计算器,并结合提供的"计算器"文件名称来...
在C语言中实现一个计算器功能是一项基础而有趣的编程任务,它涵盖了数据结构、逻辑思维以及基本的算法设计。栈作为一种重要的数据结构,在这里扮演了关键角色。栈被称为“后进先出”(LIFO)的数据结构,即最后入栈...
在本项目中,我们讨论的是一个使用MFC(Microsoft Foundation Classes)框架实现的计算器应用程序。MFC是微软提供的一种C++库,它封装了Windows API,使得开发Windows应用程序变得更加便捷。这个计算器应用不仅包含...
### 二叉树实现简易计算器 #### 概述 本文档介绍了一个利用二叉树来实现简易计算器的程序。...这种实现方式不仅适用于简单的数学表达式处理,也为理解和学习数据结构及算法提供了一个很好的案例。
本话题主要探讨的是如何在C++编程环境中实现一个计算器算法。C++是一种强大的、面向对象的编程语言,它允许我们高效地处理复杂的数据结构,并且非常适合编写算法。 数据结构是组织、管理和存储数据的方式,例如数组...
【标题】"简单计算器(实现多进制计算、括号计算)" 描述了这个计算器程序的特点,它不仅能够进行基本的数学运算,还具备处理多进制计算以及支持括号内的运算,这对于一个初学者来说是一个相对复杂的项目。...
用于Android计算器app处理算式字符串的代码,其功能有四则运算、运算符优先级运算、删除一个字符、清空面板等