Java实现简单的表达式计算器功能示例

本文实例讲述了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<Double> num = new Stack<Double>();// 加数值
    Stack<Character> md = new Stack<Character>();// 加运算符“+”,“-”,“*”,“/"
    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:这里再为大家推荐几款计算工具供大家参考:

在线数学表达式简单转换/计算工具:
http://tools.jb51.net/jisuanqi/exp_jisuanqi

在线一元函数(方程)求解计算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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

(0)

相关推荐

  • java图形界面AWT编写计算器

    一.前言 1)这个计算器是基于java语言下图形界面AWT编写的.其实我认为写这个计算器,实现什么功能不重要,市场也不缺这个计算器,而是在于对AWT中三大布局的及画板的使用简单控件的操作使用.通过联系熟悉掌握AWT基础为深入学习打下基础.这个计算器功能也十分简单,空有其表.不过有兴趣的话可以继续添加功能完善操作等. 2)使用平台:主要使用Myeclipse2014 3)主要知识点:java 基础; awt+swing 二.功能实现及代码展示 1)主要是layout布局的练习,对画板文本框的使用,

  • Java Swing实现简单的体重指数(BMI)计算器功能示例

    本文实例讲述了Java Swing实现简单的体重指数(BMI)计算器功能.分享给大家供大家参考,具体如下: BMI,Body Mass Index,身体质量指数,是用体重公斤数 除以 身高米数平方得出的,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准. 而本文通过运用Java Swing实现了一个简单的BMI计算器.虽然现在网页上也有相应的网页应用,但是能够做出这个计算器来,还是有点成就感的,希望自己以后做出更多比这个好的应用. 最终运行效果: 功能:可以选择三个标准:中国.亚洲.WH

  • java 简单的计算器程序实例代码

    java 简单的计算器程序 实现实例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { CalculatorFrame frame = new Calculato

  • Java实现计算器的代码

    用Java 实现的计算器,原理看代码注释,具体内容如下 public class MyCalculator { public static void main(String[] args) { String obj = "6+(8/2)+6/3+1*8 + 30"; ArrayList<String> arrayList = strFormat(obj); System.out.println(obj + "=" + calculator(arrayLi

  • java实现简易计算器功能

    本文为大家分享了java实现简易计算器功能,具体内容如下 题目: 编写一个模拟计算器的程序.在面板中添加一个文本框(显示按键及运算结果). 10个数字按钮(0~9).4个运算按钮(加.减.乘.除).一个等号按钮.一个清除按钮, 要求将按键和结果显示在文本框中. 代码过程展示: import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.Action

  • Java简易计算器程序设计

    编写一个模拟计算器的应用程序,使用面板和网格布局, 添加一个文本框,10个数字按钮(0~9),4个加减乘除按钮, 一个等号按钮,一个清除按钮,一个求平方根按钮,一个退格按钮, 要求将计算公式和结果显示在文本框中,实现效果如下图所示. Java简易计算器代码: import javax.swing.*; import javax.swing.JTextField; import java.awt.*; import java.awt.event.*; import java.lang.*; imp

  • java模仿windows计算器示例

    这个计算器的界面模仿Windows自带的简易计算器,包括交互界面和和对各种输入的响应.目前尚未实现菜单栏和记忆类按钮的功能 复制代码 代码如下: import java.awt.Color;import java.awt.Container;import java.awt.GridLayout;import java.awt.Insets;import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import

  • Java swing实现的计算器功能完整实例

    本文实例讲述了Java swing实现的计算器功能.分享给大家供大家参考,具体如下: package awtDemo; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Vector; public class Calculator { String str1 = "0"; // 运算数1 初值一定为0 为了程序的安全 String str2 = "0"

  • Java计算器核心算法代码实现

    在进行一个表达式的计算时,先将表达式分割成数字和字符串然后利用出入栈将分割后的表达式进行中缀转后缀,再将后缀表达式进行计算得到结果(思想在上一篇写过)现在贴下Java语言的代码实现.(学习Java时间不长所以可能会有很多不足的地方,我会改进也欢迎大神可以给我一些意见和建议~谢谢啦) 我将这部分分成三个方法完成功能,并在getResult方法调用(getResult方法被主方法调用) private String getResult(String str) { //分割 String[] Str

  • 200行Java代码编写一个计算器程序

    发现了大学时候写的计算器小程序,还有个图形界面,能够图形化展示表达式语法树,哈哈;) 只有200行Java代码,不但能够计算加减乘除,还能够匹配小括号~ 代码点评: 从朴素的界面配色到简单易懂错误提示,无不体现了"用户体验"至上的设计理念:代码异常处理全面合理.滴水不漏,代码缩进优雅大方,变量命名直观易懂:再结合长度适中简单明了的注释,程序整体给人一种清新脱俗之感.背后不难看出作者对学习的热爱以及对设计的苛求,工匠精神可见一斑,真可谓是大学数据结构学以致用的典范! 实现代码如下所示:

随机推荐