java小型科学计算器
/**
* 1.先转换为逆波兰顺序
* 数字直接存入list,符号压入栈中,但是如果栈底元素不大于该运算符的运算顺序,则将栈底pop,直到大于栈底运算符为止,再压入栈中,
* 最后将运算符依次全部pop(以上pop出的运算符存入list)
* 2.根据逆序算出结果
* 从头到尾依次读取list的数据,将数字压入栈中,出现运算符后pop出两个数字进行运算,运算式为"后pop数 运算符 先pop数"
* 运算完毕将结果再次压入栈中.结束后,将数字栈中的唯一一个数字pop出并将其返回.
*
*
* 学习之处:
* 1.String对象的比较不要用==,>,<.而是用equal()函数.
* 2.使用HashMap<Object,Integer>()的定义可以给对象进行编号或加权.
* 3.需要时要给读取的信息加上结尾标志,如读入String结尾的"#".
* 4.取String的单个字母:String temps=String.valueOf(expression.charAt(i));
* 5.检测数字:temps.matches("[0-9.]")
**/
public class Calculator {
private String string;
private MyStack<String> opratorStack = new MyStack();
private MyStack<Double> numberStack = new MyStack();
private ArrayList<String> rpnList = new ArrayList();
private Map<String,Integer> priorityMap=new HashMap<String,Integer>();//用于存储操作符优先级的Map
//初始化优先级约定(可根据计算的复杂程度扩展)
public Calculator(String str)
{
priorityMap.put("+",0);
priorityMap.put("-",0);
priorityMap.put("*", 1);
priorityMap.put("/", 1);
priorityMap.put("(", 2);
string = str+"#";
}
private int getPriority(String op)//得到一个操作符的优先级
{
return priorityMap.get(op);
}
private void toRpn() {
String temp = "";
for (int i = 0; i < string.length(); i++) {
String ch = String.valueOf(string.charAt(i));
if (ch.matches("[0-9.]"))
temp += ch;
else { //如果操作数完整,现将其存入list中再进行后续操作
if(!temp.equals("")) {//防止加入进空格
rpnList.add(temp);
temp = "";
}
if (ch.equals("#")) { //读取结束时将运算符栈依次pop并添加到rpnList中
while (!opratorStack.isEmpty()) {
rpnList.add(opratorStack.pop());
}
} else if (ch.equals(")")) { //遇到右括号将左括号后的运算符全部pop
String op = opratorStack.pop();
while (!op .equals("(")) {
rpnList.add(op);
op = opratorStack.pop();
}
} else {
if (!opratorStack.isEmpty()) { //如果为普通的运算符
String endOprator = opratorStack.endValue();
while (!endOprator.equals( "(") && (getPriority(ch) < getPriority(endOprator)
|| getPriority(ch) == getPriority(endOprator))) {
rpnList.add(opratorStack.pop());//如果
if (!opratorStack.isEmpty()) {
endOprator = opratorStack.endValue();
}else
break;
}
opratorStack.push(ch);
}
else
opratorStack.push(ch);
}
}
}
}
public double calculate(String string){
this.string = string+"#";
return calculate();
}
public double calculate(){
toRpn();//逆波兰序列转换
//扫描String对象
for(int i = 0; i < rpnList.size(); i++){
String temp = rpnList.get(i);
//匹配第一个字符,为数字的则将String对象转为Double并存入numberStack中
if(String.valueOf(temp.charAt(0)).matches("[0-9]")){
numberStack.push(Double.valueOf(temp));
} //匹配到运算符,调出最后两个numberStack中数字进行运算,并将得数压入栈中(栈次底数 操作符 栈最底数)
else {
//Double n = opration(numberStack.pop(), numberStack.pop(), temp);
Double n = numberStack.pop();
numberStack.push(opration(numberStack.pop(), n , temp));
}
}
rpnList = new ArrayList();//为下次运算做准备
return numberStack.pop();
}
private Double opration(Double val1,Double val2,String oprator){
if(oprator.equals("+"))
val1 += val2;
else if(oprator.equals("-"))
val1 -= val2;
else if(oprator.equals("*"))
val1 *= val2;
else
val1 /= val2;
return val1;
}
public static void main(String[] args) {
String string1 = "12+2*37-(4*5+6)*7";
Calculator calculator = new Calculator(string1);
System.out.println(calculator.calculate());
System.out.println(calculator.calculate("4.99+5.99+6.99*1.06"));
}
}
运算结果:
-96.0
18.389400000000002
Process finished with exit code 0
java小型科学计算器的更多相关文章
- 科学计算器的Java实现
简易的科学计算器的实现 ---Java版 import javax.swing.*;//新的窗口组件包 import java.awt.*; import java.awt.event.*; publ ...
- 想找个计算器当本命?来试试UWP应用《纸书科学计算器》
久违了.上次在博客园发文还是4年前,正是高中参加NOIP的时候.这4年里发生了很多事,乃至再次看到过去的文章时,仿佛看到了自己也不熟悉的风景.最近很想把我的博客重新拾起来,慢慢灌溉,写一些微不足道的技 ...
- 整理一些《纸书科学计算器》的小Tips
本文最开始是在2016年的文章 Win10应用<纸书科学计算器>更新啦! 发表之后撰写的,当时那篇文章收到了不少人点赞,应用在国内市场的日下载量也突然上涨,让我感到受宠若惊,这里要感谢Wp ...
- Win10应用《纸书科学计算器》更新啦!
<纸书科学计算器>在2016年8月拿了计算机设计大赛国家一等奖,现在仍记得我在答辩时还给评委们普及了一波UWP平台的知识.受此鼓励,这款应用也不会停下更新的脚步^_^.最近从1.9小幅升级 ...
- html+css+js实现科学计算器
代码地址如下:http://www.demodashi.com/demo/13751.html 项目描述 纯html+css+js实现一个科学计算器,支持平方开方指数对数等基本函数,支持键盘输入,有简 ...
- 实习模块vue+java小型全栈开发(三)
实习模块vue+java小型全栈开发(三) --dx 背景 首先,先给自己一个答案:这篇博客我定义为(三),因为之前的两个模块页面,内容都是一样的,但是被改了几次需求,就一直拖着没有上传. 今天是真正 ...
- 《学习R》笔记:科学计算器、检查变量和工作区、向量、矩阵和数组、列表和数据框
一.第二章 科学计算器 要检查两个数字是否一样,要使用 all.equal() ,不要使用 == ,== 符号仅用于比较两个整型数是否存在相同 . > all.equal(sqrt(2)^2,2 ...
- 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】
比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 - -5.22 ) )与7.5+-3*8/(7+2) windows ...
- JS编写的科学计算器
最近半个月编写了一个JS+CSS+HTML的网页计算器,从最初的具有简陋界面的简单计算器改版到最终具有科学/标准计算器转换功能并且界面非常友好的计算器,收获良多!总的来说,代码简单,通俗易读,下面贴上 ...
随机推荐
- opals 开发记录
1:开发需要的文件 下载地址:http://www.geo.tuwien.ac.at/opals/html/index.html 注意只能在release下才能通过. 我自己整理好的(64位的),以备 ...
- Simple Daemon Shell
PROPATH="/var/www/html/" PROGRAM="vertical" LOGNAME="/tmp/monitor.vertical. ...
- $digest already in progress
最近在写项目时经常遇到一个小问题,在上下文外改变视图,通常来说我们需要apply()便可以实现,问题是加了apply()后控制台报错:$digest already in progress:随后我把a ...
- requirejs--源码分析
/*---------------------------------------start-------------------------------*/ req({}); // num == 1 ...
- 【python】bytearray和string之间转换,用在需要处理二进制文件和数据流上
最近在用python搞串口工具,串口的数据流基本读写都要靠bytearray,而我们从pyqt的串口得到的数据都是string格式,那么我们就必须考虑到如何对这两种数据进行转换了,才能正确的对数据收发 ...
- NDEF-NFC数据交换格式
为实现NFC标签.NFC设备以及NFC设备之间的交互通信,NFC论坛(NFC FROUM)定义了称为NFC数据交换格式(NDEF)的通用数据格式.NDEF是轻量级的紧凑的二进制格式,可带有URL,vC ...
- Java application 性能分析分享
性能分析的主要方式 监视:监视是一种用来查看应用程序运行时行为的一般方法.通常会有多个视图(View)分别实时地显示 CPU 使用情况.内存使用情况.线程状态以及其他一些有用的信息,以便用户能很快地发 ...
- Linux进程间通信——使用命名管道
在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程 ...
- 常用的IO流
常用的IO流 •根据处理数据类型的不同分为:字节流和字符流 •根据数据流向不同分为:输入流和输出流 字节流:字节流以字节(8bit)为单位,能处理所有类型的数据(如图片.avi等). 字节输入流:In ...
- [Leetcode][Python]51: N-Queens
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 51: N-Queenshttps://oj.leetcode.com/pro ...