/**
* 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. Mysql JOIN优化。

    join性能自行百度,google 数据60w+,这里我只测试了一个limit , ) ,) AS C LEFT JOIN table2 AS B ON C.e_id=B.id; ) ,;

  2. Linux Power(一): kernel/power/earlysuspend.c

    /* kernel/power/earlysuspend.c * * Copyright (C) 2005-2008 Google, Inc. * * This software is license ...

  3. Jumpserver

    Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 支持常见系统: redhat centos debi ...

  4. mysql的四种隔离级别

    一.READ UNCOMMITTED(未提交读) 在READ UNCOMMITTED级别,事务中的修改,即使未提交,对其他事务也都是可见的.事务可以读取未提交的数据,这也被称为脏读( Dirty RE ...

  5. WDLINUX (Centos5.8) 安装 soap

    CENTOS5.8  PHP5.2.17 [PHP5.3.27版的看这里] WDLINUX (centos) 安装 soap====================================== ...

  6. CKfinder中文乱码的解决.

    最近在写一个类似博客的系统,使用了ckeditor和ckfinder,但是发现ckfinder在上传中文文件名的文件过程中会出现中文乱码的情况. 于是百度google乎,发现大多数的解决办法都是将文件 ...

  7. Django学习(二) Django框架简单搭建

    为了快速学习Python进行Web的开发,所以我不准备从Python的基础学起,直接从Django框架入手,边学框架边学Python的基础知识. 下面就开始Django的快速开发之旅吧. 关于Djan ...

  8. 转:Memcached常用命令及使用说明

    一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...

  9. Tar打包、压缩与解压缩到指定目录的方法

    tar在linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数: -x : 解压缩压缩档案的参数: -z : 是 ...

  10. GPS功能:百度路书自定义【轨迹回放】

    如题所述:百度的编辑界面很直观,修改后就可以运行,地址:http://developer.baidu.com/map/jsdemo.htm#c2_8: 因为同事研究了一下午结果都没搞出来,他copy百 ...