国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java實現簡單的表達式計算器功能示例

Java實現簡單的表達式計算器功能示例

2021-05-12 14:21HiBoyljw Java教程

這篇文章主要介紹了Java實現簡單的表達式計算器功能,結合實例形式分析了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自己自帶棧的功能,用起來會方便很多。

值得注意的是:用來裝數值的棧,最多存兩個數值,這是為了計算。而裝符號的則是裝一個。當我們遇到' *' 和'/‘時,我們是先進行運算,再壓棧。對了,在寫運算函數時一定要注意,運算的順序,我自己寫的時候,因為大意,也是被坑了很久。

具體代碼如下:

?
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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩在线一区二区 | 黄色一级片在线观看 | 在线观看91视频 | 欧美亚洲综合久久 | 成年人综合网 | 国产片性视频免费播放 | 欧美老妇交乱视频 | 亚洲国内精品 | 91免费版在线观看 | 成年人免费网站 | 精品91久久 | 精品在线一区二区 | 做a视频免费观看 | 午夜视频网站 | 999在线观看精品免费不卡网站 | 欧美老妇交乱视频 | 视频一区免费观看 | 欧美视频网站 | 成人亚洲网 | 国产一区二区三区四区 | 色婷婷综合久久久中文字幕 | 北条麻妃在线一区二区 | 亚洲视频在线播放 | 久久国产区 | 91精品国产综合久久精品 | 精品综合99久久久久久www | 婷婷久久久 | 国产精品18久久久 | 亚洲欧美日韩精品 | 午夜免费视频福利 | av一区二区三区四区 | 91嫩草精品| 亚洲影视在线 | 一区亚洲 | 福利视频网站 | av在线电影观看 | 黄色毛片免费视频 | 欧美午夜一区 | 日本在线观看网址 | 亚洲综合在线视频 | 日韩视频在线观看 |