/**
* 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小型科学计算器的更多相关文章

  1. 科学计算器的Java实现

    简易的科学计算器的实现 ---Java版 import javax.swing.*;//新的窗口组件包 import java.awt.*; import java.awt.event.*; publ ...

  2. 想找个计算器当本命?来试试UWP应用《纸书科学计算器》

    久违了.上次在博客园发文还是4年前,正是高中参加NOIP的时候.这4年里发生了很多事,乃至再次看到过去的文章时,仿佛看到了自己也不熟悉的风景.最近很想把我的博客重新拾起来,慢慢灌溉,写一些微不足道的技 ...

  3. 整理一些《纸书科学计算器》的小Tips

    本文最开始是在2016年的文章 Win10应用<纸书科学计算器>更新啦! 发表之后撰写的,当时那篇文章收到了不少人点赞,应用在国内市场的日下载量也突然上涨,让我感到受宠若惊,这里要感谢Wp ...

  4. Win10应用《纸书科学计算器》更新啦!

    <纸书科学计算器>在2016年8月拿了计算机设计大赛国家一等奖,现在仍记得我在答辩时还给评委们普及了一波UWP平台的知识.受此鼓励,这款应用也不会停下更新的脚步^_^.最近从1.9小幅升级 ...

  5. html+css+js实现科学计算器

    代码地址如下:http://www.demodashi.com/demo/13751.html 项目描述 纯html+css+js实现一个科学计算器,支持平方开方指数对数等基本函数,支持键盘输入,有简 ...

  6. 实习模块vue+java小型全栈开发(三)

    实习模块vue+java小型全栈开发(三) --dx 背景 首先,先给自己一个答案:这篇博客我定义为(三),因为之前的两个模块页面,内容都是一样的,但是被改了几次需求,就一直拖着没有上传. 今天是真正 ...

  7. 《学习R》笔记:科学计算器、检查变量和工作区、向量、矩阵和数组、列表和数据框

    一.第二章 科学计算器 要检查两个数字是否一样,要使用 all.equal() ,不要使用 == ,== 符号仅用于比较两个整型数是否存在相同 . > all.equal(sqrt(2)^2,2 ...

  8. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  9. JS编写的科学计算器

    最近半个月编写了一个JS+CSS+HTML的网页计算器,从最初的具有简陋界面的简单计算器改版到最终具有科学/标准计算器转换功能并且界面非常友好的计算器,收获良多!总的来说,代码简单,通俗易读,下面贴上 ...

随机推荐

  1. 自己写的轻量级PHP框架trig与laravel5.1,yii2性能对比

    看了下当前最热门的php开发框架,想对比一下自己写的框架与这些框架的性能对比.先看下当前流行框架的投票情况. 看结果对比,每个测试脚本做了一个数据库的联表查询并进行print_r输出,查询的sql语句 ...

  2. [转]在ITunes播放中前进、后退五秒的快捷键

    在ITunes播放中前进.后退五秒的快捷键 如题,快捷键为Command+Alt+方向键.听Podcast一两句没听清楚的时候很有用. reference: http://mac.pcbeta.com ...

  3. Mac ssh登陆linux并且显示linux图形

    背景: Mac 通过[终端]ssh登陆linux并且在Mac显示linux图形 Mac 主机IP: 10.2.1.1 linux 主机IP: 192.168.1.1 说明: 想要ssh访问并且显示li ...

  4. 初学swift笔记 结构体(八)

    import Foundation /* 和类很相似 结构体 -> 封装 属性.方法 结构体是值类型 */ //定义一个LSQ类型的结构体 关键字struct struct LSQ { var ...

  5. 寻找最大数--nyoj题目448

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  6. C语言学习second--C语言基础学习

    1.标准C语言 C语言诞生于20世纪70年代,年龄比我们自己还要大,期间产生了很多标准,但是各种编译器对标准的支持不尽相同. ANSI C是使用的最广泛的一个标准,也是第一个正式标准,被称为“标准C语 ...

  7. MYSQL delete性能优化!

    优化项 1. low_priority 当没有连接文章表时才进行删除操作. delete low_priority from T; 优化项 2. quick 当删除行时并不删除行的索引.如果再次插入这 ...

  8. MYSQL 查看当前用户与数据库版本

    问题一: 查看当前用户 select user(); 问题二: 查看数据库版本 select version();

  9. 如何实现Linux下的U盘(USB Mass Storage)驱动

    如何实现Linux下的U盘(USB Mass Storage)驱动 版本:v0.7 How to Write Linux USB MSC (Mass Storage Class) Driver Cri ...

  10. SD卡在单片机上的应用

    (1)SD卡的引脚定义:  SD卡SPI模式下与单片机的连接图: 注意:SPI模式时,这些信号需要在主机端用10~100K欧的电阻上拉.      SD卡支持两种总线方式:SD方式与SPI方式.    ...