本文实例讲述了Java实现简单的表达式计算器功能。分享给大家供大家参考,具体如下:

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input

1 + 2

4 + 2 * 5 - 7 / 11

0

Sample Output

3.00

13.36

这是一个简单的计算器。下面我自己讲一下原理吧。简单的来说就是弄两个栈一个用来存数值,一个用来存加减乘除的符号。你也可以用数组来做,不过JAVA自己自带栈的功能,用起来会方便很多。

值得注意的是:用来装数值的栈,最多存两个数值,这是为了计算。而装符号的则是装一个。当我们遇到' *' 和'/‘时,我们是先进行运算,再压栈。对了,在写运算函数时一定要注意,运算的顺序,我自己写的时候,因为大意,也是被坑了很久。

具体代码如下:

package Temp;

import java.util.Scanner;

import java.util.Stack;

public class P1237 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

String str = sc.nextLine();

while (!str.equals("0")) {// 到0了就结束 用栈来做

Stack num = new Stack();// 加数值

Stack md = new Stack();// 加运算符“+”,“-”,“*”,“/"

String str1[] = str.split(" ");// 用一个新的数组,以空格来划分

for (int i = 0; i < str1.length; i++) {

if (isNumber(str1[i])) {// 如果是数字就加栈

double d = Double.parseDouble(str1[i]);

if (num.size() <= 1) {// 最少能放俩个数字进去

num.push(d);

}

} else {

if (md.isEmpty()) {// 如果加字符的为空就加入进去

md.push((str1[i]).charAt(0));

} else {

char md1 = md.peek();// 看栈的顶层是什么符号

char md2 = str1[i].charAt(0);// i i的符号

/*

* 下面自己写个函数来根据返回值来判断,先运行什么符号

*/

if (opration(md1, md2) <= 1) {

double nextNum = num.pop();// 进行弹栈来运算//代表栈的顶端

double lastNum = num.pop();// 代表栈的底端

// 因为是小于等于一所以先把MD中的符号弹栈,再把后面的符号压栈,再把结果放入num中

num.push(math(lastNum, nextNum, md.pop()));

md.push(str1[i].charAt(0));

/* 可以不要 */

// } else if (opration(md1, md2) == 2// 判断下一个符号

// && i + 2 < str1.length

// && opration((str1[i + 2]).charAt(0), md2) != 1) {

// double nextNum = Double.valueOf(str1[i + 1]);

// double lastNum = num.pop();

// num.push(math(nextNum, lastNum, md2));

} else if (opration(md1, md2) == 2) {

double nextNum = Double.valueOf(str1[++i]);// 获得下一个

double lastNum = num.pop();

num.push(math(lastNum, nextNum, md2));

}

}

}

}

if (!md.empty()) {// 运算符栈中不空的话,数值栈中一定有俩个数值

double nextNum = num.pop();

double lastNum = num.pop();

// System.out.printf("%.2f", math(lastNum, nextNum, md.pop()));

System.out.println(String.format("%.2f",

math(lastNum, nextNum, md.pop())));

} else if (num.size() == 1) {

// System.out.printf("%.2f\n", num.pop());

System.out.println(String.format("%.2f", num.pop()));

}

str = sc.nextLine();// 获取下一个运算

}

}

private static Double math(double num1, double num2, Character pop) {

// 用swith case来进行匹配运算

switch (pop) {

case '+':

return (num1 + num2);

case '-':

return num1 - num2;

case '*':

return num1 * num2;

case '/':

return num1 / num2;

}

return (double) 0;

}

private static int opration(char md1, char md2) {

if (md1 == '*' || md1 == '/') {

if (md2 == '*' || md2 == '/') {

return 0;// 如果两个都是乘法或者除法那么运算顺序是一样的

} else

return 1;// 那先运行md1

} else {

if (md2 == '*' || md2 == '/') {

return 2;// 先运行md2

}

}

return 0;// 都是加加减法顺序一样

}

// 判断是否是数字

private static boolean isNumber(String str) {

char ch[] = str.toCharArray();

for (int i = 0; i < str.length(); i++) {

if (ch[i] < 48 || ch[i] > 57) {

return false;

}

}

return true;

}

}

PS:这里再为大家推荐几款计算工具供大家参考:

希望本文所述对大家java程序设计有所帮助。

表达式计算器 java代码_Java实现简单的表达式计算器功能示例相关推荐

  1. java在线打开xml文件_java实现简单解析XML文件功能示例

    本文实例讲述了java实现简单解析XML文件功能.分享给大家供大家参考,具体如下: package demo; import java.io.File; import java.io.IOExcept ...

  2. 矩形计算器java代码_java代码---------计算器实现

    总结:虽然,没有人会帮你到底,凭什么要对你怜香惜玉 注意实现哪一个运算就把相关代码放在else if这个判断语句里面 package com.rue; import java.awt.BorderLa ...

  3. 象棋联机java代码_java实现简单网络象棋游戏

    本文实例为大家分享了java实现网络象棋游戏的具体代码,供大家参考,具体内容如下 游戏规则: 1.将/帅:不能出田字格,不能走斜线,只能前进后退向左向右,每次只走一格: 2.士/仕:不能出田字格,只能 ...

  4. 弹球小游戏java代码_java实现简单的弹球游戏

    弹球游戏实现原理: 隔一定时间(小于1秒)重新绘制图像,因为Graphics类是一个抽象类,创建子类的时候需要把所有涉及的方法都得重写,所以这里使用的是创建Canvas的子类,只需要重写它的paint ...

  5. 存款利息计算器html代码,html+jQuery简单的利息计算器

    计算利息的公式:利息=本金*利率/计息*(到期日期-起息日期) 但是每次都要自己算很麻烦,不如开发个小东西,直接输入就可以得出利息,用了一点时间做好了,虽然简单,还是想奉献给大家~ --index.h ...

  6. 数独游戏完整java代码_Java实现蓝桥杯数独游戏的示例代码

    你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...

  7. 计算两个数的乘积java编写_Java模拟计算机的整数乘积计算功能示例

    本文实例讲述了Java模拟计算机的整数乘积计算功能.分享给大家供大家参考,具体如下: 计算机计算整数乘积的原理: 实现代码: package math; public class two { /** ...

  8. 亲戚关系关系算法java程序_亲戚称呼计算器java代码

    展开全部 计算器java代码62616964757a686964616fe58685e5aeb931333337386663import java.awt.BorderLayout; import j ...

  9. python读取json配置文件_Python简单读取json文件功能示例

    本文实例讲述了Python简单读取json文件功能.分享给大家供大家参考,具体如下: read_json.json: { "rule":{ "namespace" ...

最新文章

  1. 轻量级高精度分割网络推荐
  2. 什么是Spring Integration?
  3. Api demo源码学习(8)--App/Activity/QuickContactsDemo --获取系统联系人信息
  4. input输入框汇总
  5. window 2008+apache2.4.4+php5.5+mysql-5.6.12+phpmyadmin4.0.4.1安装过程(参考他人文章基础上加上自己遇到的问题)...
  6. 语言中能产生汉明窗吗_0—6岁幼儿的语言、秩序、情感、数学敏感期,有这些特点和表现...
  7. 火速拿来用!对比 12,000 个 Vue.js 开源项目发现最实用的 TOP45!
  8. HDU 5936 2016CCPC杭州 D: Difference(折半枚举)
  9. java数据类型转换方向_java基础学习篇02(数据类型转换和基本面试题)
  10. ARM:让Mali带来更极致的移动VR体验
  11. linux安装vmware没有网络,关于无桌面的linux安装VMWare Tools配置的教程
  12. 用visualstudio创建html,VisualStudio如何制作html网页
  13. 微信抢红包微信 PHP代码实现
  14. SQL语句中查询数据
  15. 【原】使用IPV6,nbsp;10M/s高速BT互传…
  16. Istio:服务发现和Pilot的架构机制
  17. 图数据库nebula
  18. 代码静态检查工具汇总
  19. 计算机网络之CPT实验
  20. 计算机毕业设计springboot交通违章管理系统的设计与实现s7830源码+系统+程序+lw文档+部署

热门文章

  1. APP测试与WEB测试的区别
  2. spring集成kafka运行时报错:Failed to construct kafka producer] with root cause
  3. 大数据开发课程:大数据开发培训课程
  4. 奥运排行榜(25 分)
  5. 计算机科学排行榜2018年,2018本科计算机专业社会影响力排行榜!电子科大实至名归...
  6. 现货、期货、期权、权证
  7. python实现雪花飘落效果_python实现雪花飘落效果实例讲解及源码分享!
  8. 搜索框的代码css,css搜索框_精美css搜索框代码
  9. 天气图标下载_50种免费天气图标集可供下载
  10. 金典指纹考勤机安装及使用操作步骤