服务器之家

服务器之家 > 正文

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

时间:2021-05-12 14:21     来源/作者:HiBoyljw

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

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

input

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

output

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

sample input

1 + 2
4 + 2 * 5 - 7 / 11
0

sample output

3.00
13.36

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

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

具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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;
  }
}

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

原文链接:https://blog.csdn.net/hiboyljw/article/details/47731959

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部