以下代码来自:https://bbs.csdn.net/topics/380022283

四则运算的主要难点在于,中缀表达式优先级的处理,为方便运算一般都是将中缀表达式转换成后缀表达式,使用的算法一般为场度调度算法。
思想:
需要用到一个List和一个StackList用于存放后缀表达式,栈Stack用于存放待入List的运算符。
对于给定的中缀表达式字符串,依次读入每个字符执行下列步骤:
1、对于操作数,直接放入后缀表达式。
2、对于运算符因为不知道在它之后有没有优先级比它高的,因此,在栈内没有运算符时,新来的运算符(待入栈的运算符)直接进栈。如果栈内有运算符,那么比较栈顶运算符与新来的运算符的优先级,如果栈顶运算符优先级更高或者相等,说明栈顶的运算符优先级更高或它先来(同级先来先算),则栈顶运算符退栈,新来的运算符继续和后面的栈顶运算符比较,直到它的优先级更大(或者栈空了),它就可进栈了。
3、遍历完了中缀表达式字符串,如果栈没空,就将栈内元素依次存进后缀表达式。

优先级比较:

 static final String symbol = "+-*/()"; //运算符static final String[] priority = {"+-","*/","()"}; //运算符优先级static Comparator<String> comp = new Comparator<String>(){public int compare(String s1,String s2){int n1 = 0, n2 = 0;for(int i = 0; i < priority.length; i++){if(priority[i].indexOf(s1) >= 0) { n1 = i; }if(priority[i].indexOf(s2) >= 0) { n2 = i; }}return n1 - n2;}};

中缀表达式转后缀表达式:
下列代码实现了,将形如2.5*4+(5*5)+55/55+4+5*(55+3)的中缀表达式转为后缀表达式,不包含单目运算符,允许表达式有多余的空格,对于中缀表达式为null的、括号不匹配的、表达式不合法的会抛出异常。

public static List<String> infixToSuffix(String expression) throws Exception
{if(expression == null){throw new Exception("illegal parameter.");}expression.replaceAll("\\s*", "");   // "\\s*"为正则表达式,\\s代表空格,*表示0个或者多个List<String>list = new ArrayList<String>();       //存放后缀表达式Stack<String> opStack = new Stack<String>();  //运算符栈StringBuffer buffer = new StringBuffer();for(char ch : expression.toCharArray()){if(symbol.indexOf(ch) >= 0)  //是运算符{if(buffer.length() > 0)  //如果有操作数{String v = buffer.toString();if( !v.matches("\\d+([.]\\d+)?") ) //如果不是形如125或者1235.25的数为非法数字{throw new Exception("illegal variable("+v+").");}list.add(v);buffer.delete(0, buffer.length());}if(ch == '(')       //左括号直接入栈{opStack.push(String.valueOf(ch));   //入栈}else if(ch == ')'){  //扩号内运算符退栈,以消括号String lastOp = "";while(opStack.size() > 0){lastOp = opStack.pop();if(lastOp.equals("(")){break;}else{list.add(lastOp);}}if(!"(".equals(lastOp)) //说明括号不匹配{throw new Exception("illegal express.");}}else if( opStack.size() > 0){String str = String.valueOf(ch);String lastOp = opStack.peek();  //不弹出if(lastOp.equals("(") || comp.compare(str,lastOp) > 0){  //如果待入栈的运算符是"("或者优先级比栈顶运算符更高则直接入栈opStack.push(str);}else //优先级更低或相等则把先来运算符退栈,然后再进栈{lastOp = opStack.pop();list.add(lastOp);opStack.push(str);}}else  //还没有运算符{opStack.push(String.valueOf(ch));}}else //不是运算符则当作操作数,因为已经去除所有空格,这里不再需要判断空格{buffer.append(ch);}}while(opStack.size() > 0){String lastOp = opStack.pop();if("()".indexOf(lastOp) >= 0){throw new Exception("illegal express.");}list.add(lastOp);}return list;}

对后缀表达式进行计算:

 public static double calculator(List<String> list) throws Exception{ //计算Stack<Double> val = new Stack<Double>();double result = 0;while (list.size() > 0) {String s = list.remove(0);if (symbol.indexOf(s) >= 0){double d1 = val.pop();double d2 = val.pop();if ("+".equals(s)) {result = d2 + d1;} else if ("-".equals(s)) {result = d2 - d1;} else if ("*".equals(s)){result = d2 * d1;} else if ("/".equals(s)) {result = d2 / d1;} else {throw new Exception ("illigal symbol("+s+").");}val.push(result);} else {if (!s.matches("\\d+([.]\\d+)?")) {throw new Exception ("illigal variable("+s+").");}val.push(Double.valueOf(s));}}return result;}

可测试代码:

package calculator;          //包import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Stack;public class Test
{static final String symbol = "+-*/()"; //运算符static final String[] priority = {"+-","*/","()"}; //运算符优先级static Comparator<String> comp = new Comparator<String>(){public int compare(String s1,String s2){int n1 = 0, n2 = 0;for(int i = 0; i < priority.length; i++){if(priority[i].indexOf(s1) >= 0) { n1 = i; }if(priority[i].indexOf(s2) >= 0) { n2 = i; }}return n1 - n2;}};public static void main(String[] args) throws Exception{String expression = "2.5*4+(2*5)+54/54+4";List<String>list = infixToSuffix(expression);System.out.println(list);double result = calculator(list); //计算结果System.out.printf("%.2f\n",result);}public static List<String> infixToSuffix(String expression) throws Exception{if(expression == null){throw new Exception("illegal parameter.");}expression.replaceAll("\\s*","");  // "\\s*"为正则表达式,\\s代表空格,*表示0个或者多个List<String>list = new ArrayList<String>();       //存放后缀表达式Stack<String> opStack = new Stack<String>();  //运算符栈StringBuilder buffer = new StringBuilder();for(char ch : expression.toCharArray()){if(symbol.indexOf(ch) >= 0)  //是运算符{if(buffer.length() > 0)    //如果有操作数{String v = buffer.toString();if( !v.matches("\\d+([.]\\d+)?") ) //如果不是形如125或者1235.25的数为非法数字{throw new Exception("illegal variable("+v+").");}list.add(v);buffer.delete(0, buffer.length());}if(ch == '(')       //左扩号直接入栈{opStack.push(String.valueOf(ch));   //入栈}else if(ch == ')'){  //扩号内运算符退栈,以消括号String lastOp = "";while(opStack.size() > 0){lastOp = opStack.pop();if(lastOp.equals("(")){break;}else{list.add(lastOp);}}if(!"(".equals(lastOp)) //说明括号不匹配{throw new Exception("illegal express.");}}else if( opStack.size() > 0){String str = String.valueOf(ch);String lastOp = opStack.peek();  //不弹出if(lastOp.equals("(") || comp.compare(str,lastOp) > 0){  //如果待入栈的运算符是"("或者优先级比栈顶运算符更高则直接入栈opStack.push(str);}else //优先级更低或相等则把先来运算符退栈,然后再进栈{lastOp = opStack.pop();list.add(lastOp);opStack.push(str);}}else  //还没有运算符{opStack.push(String.valueOf(ch));}}else //不是运算符则当作操作数,因为已经去除所有空格,这里不再需要判断空格{buffer.append(ch);}}if (buffer.length() >0)         //最后一个操作数{list.add(buffer.toString());}while(opStack.size() > 0){String lastOp = opStack.pop();if("()".indexOf(lastOp) >= 0){throw new Exception("illegal express.");}list.add(lastOp);}return list;}public static double calculator(List<String> list) throws Exception{ //计算Stack<Double> val = new Stack<Double>();double result = 0;while (list.size() > 0) {String s = list.remove(0);if (symbol.indexOf(s) >= 0){double d1 = val.pop();double d2 = val.pop();if ("+".equals(s)) {result = d2 + d1;} else if ("-".equals(s)) {result = d2 - d1;} else if ("*".equals(s)){result = d2 * d1;} else if ("/".equals(s)) {result = d2 / d1;} else {throw new Exception ("illigal symbol("+s+").");}val.push(result);} else {if (!s.matches("\\d+([.]\\d+)?")) {throw new Exception ("illigal variable("+s+").");}val.push(Double.valueOf(s));}}return result;}
}

java四则运算,计算器的实现相关推荐

  1. 用java写一个四则运算计算器

    好的,下面是一个用Java实现的四则运算计算器代码: import java.util.Scanner;public class Calculator {public static void main ...

  2. Java制作计算器实现加减乘除

    Java制作计算器主要需要考虑的是加减乘除的运算顺序的优先级, 比如: 20-2-1.7*4/5-4*2 需要先计算1.7*4/5, 再计算4 *2, 最后从左往右计算加减. 网上其他的一些计算器都是 ...

  3. 四则运算计算器c语言设计报告,8位四则运算计算器设计报告[五篇]

    单片机应用课程设计报告 设计题目 姓 名 学 号 年 级 专 业 指导教师 考核成绩 8位四则运算计算器 胡成.柏壮壮.王庆安.杜威.孙润 Z1141410 7.Z11414039 Z1141407 ...

  4. Java 实现计算器

    Java 实现计算器 *使用Java语言编写一个能实现"加.减.乘.除"四则运算的计算器程序.* 要求: (1)在程序中要体现面向对象编程语言的三大特征:封装.继承和多态. (2) ...

  5. 用链栈实现简易四则运算计算器(php版)

    栈是一种限定仅在表尾进行插入和删除操作的线性表.栈的应用有很多,比如常见的递归,计算机表达式求值等.下面我们用栈来实现简易的四则运算计算器. 列一下本文的思路: 实现链栈的数据结构及其操作 中缀表达式 ...

  6. java计算器简单吗,java简单计算器

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 无聊做个java加减乘除计算器,int型,没有小数,,呵呵,,真特么无聊,, package swing; import javax.swing.*; i ...

  7. php实现一个简单的四则运算计算器

    php实现一个简单的四则运算计算器(还不支持括号的优先级).利用栈这种数据结构来计算表达式很赞. 这里可以使用栈的结构,由于php的数组"天然"就有栈的特性,这里直接就利用了数组. ...

  8. 科学计算机java算法实现,(Java)科学型计算器开发及实现.doc

    (Java)科学型计算器开发及实现 淮北师范大学 科学型计算器的开发与实现 学 院 计算机科学与技术 专 业学 生 姓 名学 号指导教师姓名科学型计算器的开发与实现 作 者: 指导教师: 摘 要:目前 ...

  9. java实现复制粘贴的计算器_软帝学院教你用java编写计算器(三)

    教你用java编写计算器(三) import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionListen ...

  10. java使用计算器完成加法、减法运算

    java使用计算器完成加法.减法运算 package demo03;/*** 使用计算器完成加法.减法运算*/ public class Calculator {//成员变量private Strin ...

最新文章

  1. Only the original thread that created a view hierarchy can touch its views
  2. 【Java Web后台实验与开发】The server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents more than one
  3. 计算机系本科毕业论文评阅评语,毕业论文评阅教师评语
  4. Golang 简洁架构实战
  5. 线程安全存储以及pthread_getspecific/pthread_setspecific
  6. 全数字实时仿真平台SkyEye和同步数据流语义与翻译正确性验证
  7. spring随笔(二) AOP
  8. 随想录(源代码预处理命令)
  9. Unity3D基础14:碰撞检测
  10. Demo(3月28日)
  11. keyshot卡住了还能保存吗_Sketchup建模和渲染能取代3dsMax吗?
  12. ArcGIS10.3 Desktop Server 安装教程 附下载地址
  13. 收藏夹吃灰系列(五):解决Win10插入U盘不显示磁盘可用容量且打不开卡死问题 | 超级详细,建议收藏
  14. STC单片机程序下载原理与自动下载
  15. 如何使用ModSim32模拟ModbusRTU数据?
  16. linux低级格式化工具下载,U盘低格工具(Rmprepusb)
  17. php wamp一键环境包,phpwind本地环境一键安装包Wamp 5.0使用说明
  18. D3D9 简单图形的绘制以及显示
  19. 阿里巴巴短信验证码使用
  20. 计算机二级报名时间2020年3月山西,2020年3月山西计算机二级报名及考试时间

热门文章

  1. python自动化测试-简单实现接口自动化测试(基于python)
  2. python画折线图-手把手教你Python yLab的绘制折线图的画法
  3. python和java哪个好学-Java和Python去学哪个好
  4. python是干嘛的-python语言是干什么的
  5. python创建txt文件并写入-python创建txt文件
  6. 如何自学python-如何自学python语言
  7. python从入门到精通需要多久-学Python编程难吗 从入门到精通学习Python要多久
  8. python基础编程语法-Python基础语法(Python基础知识点)
  9. 叮当:一个开源的树莓派中文智能音箱项目
  10. 【当贝市场】智能电视语音识别功能泄露隐私?