本文實(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