JAVA 实现高级计算器程序
用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 实现高级计算器程序相关推荐
- java 简单的计算器程序,Java 简易计算器程序
最近开始学习java,参考教科书写了一个简单的计算器程序,贴上来,以便有用的时候可以参考. 呵呵,哈哈!!! import java.awt.Container; import java.awt.Fl ...
- 用java实现一个计算器程序_1.2第一个java程序——hello world
第一个java程序--hello world 实现一个java程序,主要有三个步骤:1.编写源代码,2.编译源代码,3.运行.java的源代码必须先编译,然后才能由JVM解析执行.所以我们程序员第一步 ...
- 计算器的程序代码java_求用JAVA编写的计算器程序代码
展开全部 import java.awt.*;//引入包java.awt中所有的类 import java.awt.event.*;//引入包java.awt.event中所有的类. public c ...
- java 简单的计算器程序_java 简单计算器
做的很简陋 慢慢学习中!!!!!! import java.awt.*; public class 计算 { public static void main(String[] args) { win ...
- java 计算器 下载_那里可以下载到JAVA编的计算器程序??
展开全部 import java.awt.*; import java.awt.event.*; import java.lang.*; import javax.swing.*; public cl ...
- java计算器简单源代码_java 简单的计算器程序实例代码
java 简单的计算器程序 实现实例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class C ...
- 计算器的程序代码java_java 简单的计算器程序实例代码
java 简单的计算器程序 实现实例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class c ...
- java获取界面输入数字_通过JAVA设计 GUI 界面的计算器程序,用户可以通过鼠标依次输入参加计算的数值,进行加、减、乘、...
通过JAVA设计 GUI 界面的计算器程序,用户可以通过鼠标依次输入参加计算的数值,进行加.减.乘. 2016-08-22 0 0 0 4.0 分 其他 1 积分下载 如何获取积分? 通过JAVA设计 ...
- 计算器小程序java课程设计,java课程设计----计算器小程序报告.doc
java课程设计----计算器小程序报告.doc #####学院JAVA语言课程设计报告小程序计算器系统管理班级:#######姓名:#####指导老师:###时间:2012年6月25日至6月29日2 ...
- 计算器程序java开方运算_模拟计算器java程序
1 /*实现基本数学运算.函数等功能:加.减.乘.除.阶乘.正弦.余弦和指数运算.2 界面将模拟Windows中的计算器程序.*/ 3 import javax.swing.*;4 import ja ...
最新文章
- 深度学习有哪些trick?
- 王者荣耀全栈项目部署到阿里云服务器笔记
- SAP 固定资产减值准备配置及期初导入
- Python3道基础练习题
- 传感器和单片机主板之间远距离通讯应该有哪些保障处理措施
- 东方韵味传统迎接新年|旭日东升的吉利日出好运插画素材模板
- 安装完Anaconda python 3.7,想使用python3.6方法
- 框架鲜花商城系统测试_小程序商城 Open-Shop
- 学完Linux之后学什么语言,学习C语言一段时间后我们能做什么?
- python图像exif信息复制
- Python 源码混淆与加密
- Java开发webservice接口
- 树莓派接入USB摄像头
- flash中zip/unip的实际意图
- 【学懂数据结构】二叉树之舞之二叉树
- 微信小程序获取二维码scene报错40129
- 尼克尔镜头上边的字表示什么?
- Oracle 中的Userenv() 达梦中如何处理?
- PHP - 回调函数概念与用法实例分析 - 学习/实践
- Nlog日志记录组件使用