用JAVA编写了一个高级计算器程序,可以实现带括号的四则运算,如同数据结构书上所讲,可以利用栈将中缀表达式转换为后缀表达式,再利用栈计算后缀表达式。中缀表达式符合人的思维习惯,但计算机却容易理解后缀表达式。

话不多说,直接上代码:

package indi.list;
import java.util.*;public class Calculator {private static final int MAXCAPACITY = 500;private String expression;public Calculator(String expression) {if(expression.length() > MAXCAPACITY)System.out.println("字符串长度超出最大值");elsethis.expression=expression;}public int getPriority(String str) {int pri=-1;if(str.equals("("))pri=0;else if(str.equals("+") || str.equals("-"))pri=1;else if(str.equals("*") || str.equals("/"))pri=2;return pri;        }public String[] split() {ArrayList<String> strList=new ArrayList<String>();int splitIndex=0;for(int i=0;i<expression.length();i++) {if(expression.charAt(i)=='+' || expression.charAt(i)=='-' || expression.charAt(i)=='*' || expression.charAt(i)=='/' || expression.charAt(i)=='(' || expression.charAt(i)==')'){               if(splitIndex == i) { //处理连续多个操作符if(expression.charAt(i)=='-') {     //处理操作符"( + - * /"符号后面遇到"-"情况时,将后面的数字当做负数处理splitIndex=i;continue;}elsestrList.add(expression.substring(splitIndex, i+1));}else {strList.add(expression.substring(splitIndex, i));strList.add(expression.substring(i, i+1));}splitIndex=i+1;}if((i==expression.length()-1) && (splitIndex<=i))strList.add(expression.substring(splitIndex));}return strList.toArray(new String[0]);}public String[] getSuffixExpression(String[] expression) {Stack<String> strStack=new Stack<String>();ArrayList<String> strList=new ArrayList<String>();for(int i=0;i<expression.length;i++) {if(expression[i].equals("("))  //遇到'('时入栈strStack.push(expression[i]);else if(expression[i].equals("+") || expression[i].equals("-") ||expression[i].equals("*") ||expression[i].equals("/")) {if(strStack.isEmpty())     //栈空时操作符入栈strStack.push(expression[i]);else {                     //否则比较栈顶操作符优先级while((!strStack.isEmpty()) && (getPriority(strStack.peek())>=getPriority(expression[i]))) {strList.add(strStack.pop());}strStack.push(expression[i]);}                }else if(expression[i].equals(")")) {//遇到')'时出栈直至'('while(!strStack.peek().equals("(")){strList.add(strStack.pop());}strStack.pop(); //抛出'('}elsestrList.add(expression[i]);}while(!strStack.isEmpty())strList.add(strStack.pop());return strList.toArray(new String[0]);}public double getResult(String[] expression) {Stack<Double> strStack=new Stack<Double>();double num1,num2;double result=0;for(int i=0;i<expression.length;i++) {if(expression[i].equals("+") || expression[i].equals("-") ||expression[i].equals("*") ||expression[i].equals("/")) {String str=expression[i];switch(str) {case "+":{num1=strStack.pop();num2=strStack.pop();result=num2+num1;strStack.push(result);break;}case "-":{num1=strStack.pop();num2=strStack.pop();result=num2-num1;strStack.push(result);break;}case "*":{num1=strStack.pop();num2=strStack.pop();result=num2*num1;strStack.push(result);break;}case "/":{num1=strStack.pop();num2=strStack.pop();result=num2/num1;strStack.push(result);break;}}}elsestrStack.push(Double.valueOf(expression[i]));}result=0;while(!strStack.isEmpty()) {result+=strStack.pop();}return result;}public double getResult() {return getResult(getSuffixExpression(split()));}
}

上述代码为一个计算器类,包含了6个方法:

(1)public Calculator(String expression):构造函数

(2)public int getPriority(String str):获得运算符优先级

(3)public String[] split():字符串分割

(4)public String[] getSuffixExpression(String[] expression):获得后缀表达式

(5)public double getResult(String[] expression):获得运算结果

(6)public double getResult():获得运算结果

由于JAVA自带的分割函数实现的功能有限,所以这里自己实现了一个字符串分割函数,返回字符串数组,并且可以识别负数的情景。

主类中测试代码为:

package indi.list;public class Main {public static void main(String[] args) {Calculator exp1=new Calculator("-6/(-5.8-3)+0.3*(8-9)/6");String[] strSplit=exp1.split();String[] strSuffixExpression=exp1.getSuffixExpression(strSplit);double result=exp1.getResult(strSuffixExpression);System.out.println("---------原字符串是---------");System.out.println("-6/(-5.8-3)+0.3*(8-9)/6");System.out.println("-------分割后的字符串是-------");for(int i=0;i<strSplit.length;i++)System.out.print("["+strSplit[i]+"]"+"\t");System.out.println("\n");System.out.println("-------后缀形式的字符串是-------");for(int i=0;i<strSuffixExpression.length;i++)System.out.print("["+strSuffixExpression[i]+"]"+"\t");System.out.println("\n");System.out.println("---------最后计算结果是---------");System.out.println(result);System.out.println("-------计算机计算结果是-------");result=-6/(-5.8-3)+0.3*(8-9)/6;System.out.println(result);}}

输出结果为:

---------原字符串是---------
-6/(-5.8-3)+0.3*(8-9)/6
-------分割后的字符串是-------
[-6]    [/] [(] [-5.8]  [-] [3] [)] [+]    [0.3]   [*] [(] [8] [-] [9] [)] [/] [6] -------后缀形式的字符串是-------
[-6]    [-5.8]  [3] [-] [/] [0.3]   [8] [9] [-] [*] [6] [/] [+]    ---------最后计算结果是---------
0.6318181818181817
-------计算机计算结果是-------
0.6318181818181817

JAVA 实现高级计算器程序相关推荐

  1. java 简单的计算器程序,Java 简易计算器程序

    最近开始学习java,参考教科书写了一个简单的计算器程序,贴上来,以便有用的时候可以参考. 呵呵,哈哈!!! import java.awt.Container; import java.awt.Fl ...

  2. 用java实现一个计算器程序_1.2第一个java程序——hello world

    第一个java程序--hello world 实现一个java程序,主要有三个步骤:1.编写源代码,2.编译源代码,3.运行.java的源代码必须先编译,然后才能由JVM解析执行.所以我们程序员第一步 ...

  3. 计算器的程序代码java_求用JAVA编写的计算器程序代码

    展开全部 import java.awt.*;//引入包java.awt中所有的类 import java.awt.event.*;//引入包java.awt.event中所有的类. public c ...

  4. java 简单的计算器程序_java 简单计算器

    做的很简陋  慢慢学习中!!!!!! import java.awt.*; public class 计算 { public static void main(String[] args) { win ...

  5. java 计算器 下载_那里可以下载到JAVA编的计算器程序??

    展开全部 import java.awt.*; import java.awt.event.*; import java.lang.*; import javax.swing.*; public cl ...

  6. java计算器简单源代码_java 简单的计算器程序实例代码

    java 简单的计算器程序 实现实例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class C ...

  7. 计算器的程序代码java_java 简单的计算器程序实例代码

    java 简单的计算器程序 实现实例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class c ...

  8. java获取界面输入数字_通过JAVA设计 GUI 界面的计算器程序,用户可以通过鼠标依次输入参加计算的数值,进行加、减、乘、...

    通过JAVA设计 GUI 界面的计算器程序,用户可以通过鼠标依次输入参加计算的数值,进行加.减.乘. 2016-08-22 0 0 0 4.0 分 其他 1 积分下载 如何获取积分? 通过JAVA设计 ...

  9. 计算器小程序java课程设计,java课程设计----计算器小程序报告.doc

    java课程设计----计算器小程序报告.doc #####学院JAVA语言课程设计报告小程序计算器系统管理班级:#######姓名:#####指导老师:###时间:2012年6月25日至6月29日2 ...

  10. 计算器程序java开方运算_模拟计算器java程序

    1 /*实现基本数学运算.函数等功能:加.减.乘.除.阶乘.正弦.余弦和指数运算.2 界面将模拟Windows中的计算器程序.*/ 3 import javax.swing.*;4 import ja ...

最新文章

  1. 深度学习有哪些trick?
  2. 王者荣耀全栈项目部署到阿里云服务器笔记
  3. SAP 固定资产减值准备配置及期初导入
  4. Python3道基础练习题
  5. 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
  6. 东方韵味传统迎接新年|旭日东升的吉利日出好运插画素材模板
  7. 安装完Anaconda python 3.7,想使用python3.6方法
  8. 框架鲜花商城系统测试_小程序商城 Open-Shop
  9. 学完Linux之后学什么语言,学习C语言一段时间后我们能做什么?
  10. python图像exif信息复制
  11. Python 源码混淆与加密
  12. Java开发webservice接口
  13. 树莓派接入USB摄像头
  14. flash中zip/unip的实际意图
  15. 【学懂数据结构】二叉树之舞之二叉树
  16. 微信小程序获取二维码scene报错40129
  17. 尼克尔镜头上边的字表示什么?
  18. Oracle 中的Userenv() 达梦中如何处理?
  19. PHP - 回调函数概念与用法实例分析 - 学习/实践
  20. Nlog日志记录组件使用

热门文章

  1. 语音合成IC与语音IC的两三事
  2. SPSS——方差分析
  3. 游戏加速外挂的原理是什么 ?
  4. 电脑键盘各按键的作用及常用的快捷键总结
  5. C# 批量修改文件名称
  6. 蛋白组学质谱检测实验
  7. 苹果手机收不到推送信息_苹果手机微信收不到信息怎么回事(超详细解决方案分享)...
  8. 参考文献引用详细教程
  9. 基于SpringBoot微信公众号的开发
  10. win的反义词_英语近反义词辨析