一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java實(shí)現(xiàn)簡(jiǎn)單的表達(dá)式計(jì)算器功能示例

Java實(shí)現(xiàn)簡(jiǎn)單的表達(dá)式計(jì)算器功能示例

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

這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單的表達(dá)式計(jì)算器功能,結(jié)合實(shí)例形式分析了Java針對(duì)輸入表達(dá)式的符號(hào)分解與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了java實(shí)現(xiàn)簡(jiǎn)單的表達(dá)式計(jì)算器功能。分享給大家供大家參考,具體如下:

讀入一個(gè)只包含 +, -, *, / 的非負(fù)整數(shù)計(jì)算表達(dá)式,計(jì)算該表達(dá)式的值。

input

測(cè)試輸入包含若干測(cè)試用例,每個(gè)測(cè)試用例占一行,每行不超過(guò)200個(gè)字符,整數(shù)和運(yùn)算符之間用一個(gè)空格分隔。沒(méi)有非法表達(dá)式。當(dāng)一行中只有0時(shí)輸入結(jié)束,相應(yīng)的結(jié)果不要輸出。

output

對(duì)每個(gè)測(cè)試用例輸出1行,即該表達(dá)式的值,精確到小數(shù)點(diǎn)后2位。

sample input

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

sample output

3.00
13.36

這是一個(gè)簡(jiǎn)單的計(jì)算器。下面我自己講一下原理吧。簡(jiǎn)單的來(lái)說(shuō)就是弄兩個(gè)棧一個(gè)用來(lái)存數(shù)值,一個(gè)用來(lái)存加減乘除的符號(hào)。你也可以用數(shù)組來(lái)做,不過(guò)java自己自帶棧的功能,用起來(lái)會(huì)方便很多。

值得注意的是:用來(lái)裝數(shù)值的棧,最多存兩個(gè)數(shù)值,這是為了計(jì)算。而裝符號(hào)的則是裝一個(gè)。當(dāng)我們遇到' *' 和'/‘時(shí),我們是先進(jìn)行運(yùn)算,再壓棧。對(duì)了,在寫運(yùn)算函數(shù)時(shí)一定要注意,運(yùn)算的順序,我自己寫的時(shí)候,因?yàn)榇笠猓彩潜豢恿撕芫谩?/p>

具體代碼如下:

?
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了就結(jié)束 用棧來(lái)做
    stack<double> num = new stack<double>();// 加數(shù)值
    stack<character> md = new stack<character>();// 加運(yùn)算符“+”,“-”,“*”,“/"
    string str1[] = str.split(" ");// 用一個(gè)新的數(shù)組,以空格來(lái)劃分
    for (int i = 0; i < str1.length; i++) {
      if (isnumber(str1[i])) {// 如果是數(shù)字就加棧
      double d = double.parsedouble(str1[i]);
      if (num.size() <= 1) {// 最少能放倆個(gè)數(shù)字進(jìn)去
        num.push(d);
      }
      } else {
      if (md.isempty()) {// 如果加字符的為空就加入進(jìn)去
        md.push((str1[i]).charat(0));
      } else {
        char md1 = md.peek();// 看棧的頂層是什么符號(hào)
        char md2 = str1[i].charat(0);// i i的符號(hào)
        /*
         * 下面自己寫個(gè)函數(shù)來(lái)根據(jù)返回值來(lái)判斷,先運(yùn)行什么符號(hào)
         */
        if (opration(md1, md2) <= 1) {
        double nextnum = num.pop();// 進(jìn)行彈棧來(lái)運(yùn)算//代表?xiàng)5捻敹?/code>
        double lastnum = num.pop();// 代表?xiàng)5牡锥?/code>
        // 因?yàn)槭切∮诘扔谝凰韵劝裮d中的符號(hào)彈棧,再把后面的符號(hào)壓棧,再把結(jié)果放入num中
        num.push(math(lastnum, nextnum, md.pop()));
        md.push(str1[i].charat(0));
        /* 可以不要 */
        // } else if (opration(md1, md2) == 2// 判斷下一個(gè)符號(hào)
        // && 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]);// 獲得下一個(gè)
        double lastnum = num.pop();
        num.push(math(lastnum, nextnum, md2));
        }
      }
      }
    }
    if (!md.empty()) {// 運(yùn)算符棧中不空的話,數(shù)值棧中一定有倆個(gè)數(shù)值
      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();// 獲取下一個(gè)運(yùn)算
    }
  }
  private static double math(double num1, double num2, character pop) {
    // 用swith case來(lái)進(jìn)行匹配運(yùn)算
    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;// 如果兩個(gè)都是乘法或者除法那么運(yùn)算順序是一樣的
    } else
      return 1;// 那先運(yùn)行md1
    } else {
    if (md2 == '*' || md2 == '/') {
      return 2;// 先運(yùn)行md2
    }
    }
    return 0;// 都是加加減法順序一樣
  }
  // 判斷是否是數(shù)字
  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;
  }
}

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男男视频18免费网站 | 四虎精品在线视频 | 亚洲乱亚洲23p女 | 午夜DV内射一区区 | 久久受www免费人成_看片中文 | 亚洲AV午夜福利精品香蕉麻豆 | 美女禁区视频无遮挡免费看 | 无套内谢大学生A片 | 国产精品久久久久久久久久久久久久 | 成年男女免费视频网站 | 国产网站免费看 | 粗又长好猛好爽视频 | 调教女秘书 | 特黄特级高清免费视频毛片 | 调教扩张宫颈女人惨叫 | 日韩欧美一区二区三区中文精品 | 亚洲男1069gay男猛男 | 日韩高清在线高清免费 | 蹭蹭妈妈的朋友小说 | 乌克兰13一14娇小 | 四川女人偷人真实视频 | 99热这里只有精 | 日本视频在线免费看 | 亚洲国产一区二区三区a毛片 | 九九热在线免费观看 | 校花在公车上被内射好舒 | 青青草原伊人网 | 美艳教师刘艳第三部166 | 免费观看视频在线播放 | 国产极品美女在线 | 日本人成大片在线 | 古装全套 毛片 | 99热er| 男人叼女人的痛爽视频免费 | 国产日韩欧美综合一区二区三区 | 黑人巨大vs北条麻妃在线 | 亚洲a区视频| 欧美娇小性xxxx | 亚洲国产精品高清在线 | 久久re热在线视频精69 | 欧美xingai|