mini dc與簡易計算器 20165235
阿新 • • 發佈:2018-05-12
main ber expr 調用函數 char s 不可 不同的 截圖 href
mini dc
任務內容
本次mini dc任務就是通過補充代碼來實現整型數據的後綴表達式計算
相關知識
- 通過利用堆棧這一先進後出的數據結構來實現後綴表達式的計算。通過
Stack<Integer> stack
建立一個為int類型的堆棧stack
。可以使用stack.push();
來進行壓棧,stack.pop();
來進行彈棧。 - 通過調用
private boolean isOperator (String token)
來判斷按空格標記分隔好的String
數據是否為運算符。 - 使用正則表達式
“[0-9]+”
來判斷是否為字符整數類型。 StringTokenizer
類是一種可以按不同的風格對String
StringTokenizer(String s)
,則按照空格,換行,Tab等符號來做分隔標記。StringTokenizer(String s,String delim)
則按照delimit
字符序列中的任意排列來作為分隔標記。實現代碼
import java.util.Stack; import java.util.StringTokenizer; import java.util.*; public class MyDC { /** constant for addition symbol */ private final char ADD = ‘+‘; /** constant for subtraction symbol */ private final char SUBTRACT = ‘-‘; /** constant for multiplication symbol */ private final char MULTIPLY = ‘*‘; /** constant for division symbol */ private final char DIVIDE = ‘/‘; /** the stack */ private Stack<Integer> stack; // MyDC my= new MyDC(); public MyDC() { stack = new Stack<Integer>(); } public int evaluate (String expr) { int op1, op2, result = 0; String token; StringTokenizer tokenizer = new StringTokenizer (expr); while (tokenizer.hasMoreTokens()) { token = tokenizer.nextToken(); //System.out.println(token); //如果是運算符,調用isOperator if (isOperator(token)) { char []c=token.toCharArray(); op1=stack.pop(); //從棧中彈出操作數2 op2=stack.pop(); //從棧中彈出操作數1 result=evalSingleOp(c[0],op1,op2); //根據運算符和兩個操作數調用evalSingleOp計算result; stack.push(result); //計算result入棧; } else{ //如果是操作數 if(token.matches("[0-9]+")) { int number=Integer.parseInt(token); stack.push(number); } } } return result; } private boolean isOperator (String token) { return ( token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/") ); } private int evalSingleOp (char operation, int op1, int op2) { int result = 0; switch (operation) { case ADD: result = op1 + op2; break; case SUBTRACT: result = op1 - op2; break; case MULTIPLY: result = op1 * op2; break; case DIVIDE: result = op1 / op2; } return result; } }
代碼運行截圖
簡易計算器
任務內容
實現一個簡易計算器
Calc
,支持+ - x /
和%
運算, 從命令行傳入計算數據,Calc
計算器可以進行簡單的計算。相關知識
- 要使用到堆棧的一些基本知識,通過
Stack<Integer> stack=new Stack<Integer>();
來建立一個int數據類型的堆棧,來存放操作數,Stack<Character> stack1=new Stack<Character>();
來建立一個char數據類型的堆棧來存放運算符。 - 使用
StringTokenizer fenxi=new StringTokenizer(str);
String
類型的數據進行按空格進行做分隔。 需要通過
isOperator
來判斷是否為運算符,通過matches()
和正則表達來判斷是否為操作數。實現過程
通過命令行傳入
String
類型的數據,然後對傳入的數據進行按空格做分隔標記,然後對分隔好的String
數據類進行判斷是否為運算符或操作數,如果是運算符則對運算符進行壓棧(壓入stack1
),如果是操作數就i++
,並且對操作數進行壓棧(壓入stack
)i++
,當i=2
時就說明stack
棧中已經壓入兩個操作數,所以stack
進行兩次彈棧,stack1
進行一次彈棧,然後調用函數int evalSingleOp (char operation, int op1, int op2);
來計算結果,最後將結果返回。
實現代碼
import java.io.IOException;
import java.util.*;
public class CalczOperator {
/** constant for addition symbol */
private final char ADD = ‘+‘;
/** constant for subtraction symbol */
private final char SUBTRACT = ‘-‘;
/** constant for multiplication symbol */
private final char MULTIPLY = ‘x‘;
/** constant for division symbol */
private final char DIVIDE = ‘/‘;
/** constant for MOD symbol */
private final char MOD = ‘%‘;
/** the stack */
Stack<Integer> stack=new Stack<Integer>();
Stack<Character> stack1=new Stack<Character>();
int operate(String str)throws IOException {
int op1,op2,result=0;
int i=0;
String string;
StringTokenizer fenxi=new StringTokenizer(str);
while (fenxi.hasMoreTokens())
{
string = fenxi.nextToken();
//如果是運算符,調用isOperator
if (isOperator(string))
{
char c[]=string.toCharArray();
stack1.push(c[0]);
}
else{
//如果是操作數
if(string.matches("[0-9]+")) {
i++;
int number=Integer.parseInt(string);
stack.push(number);
if(i==2){
op1=stack.pop();
op2=stack.pop();
result=result=evalSingleOp(stack1.pop(),op2,op1);
}
}
}
}
return result;
}
private int evalSingleOp (char operation, int op1, int op2)
{
int result = 0;
switch (operation)
{
case ADD:
result = op1 + op2;
break;
case SUBTRACT:
result = op1 - op2;
break;
case MULTIPLY:
result = op1 * op2;
break;
case DIVIDE:
result = op1 / op2;
break;
case MOD:
result = op1 % op2;
break;
}
return result;
}
private boolean isOperator (String token)
{
return ( token.equals("+") || token.equals("-") ||
token.equals("x") || token.equals("/") ||token.equals("%"));
}
}
import java.io.IOException;
public class Calc {
public static void main (String args[]){
try {
CalczOperator calczoperator = new CalczOperator();
String[] prt = new String[args.length];
for(int i =0;i<args.length;i++){
prt[i] = args[i];
}
String str = prt[0]+" "+prt[1]+" "+prt[2]
int result = calczoperator.operate(str);
System.out.println(str + " = " + result);
}
catch (IOException e){
System.out.println("error");
}
}
}
代碼運行截圖:
遇到的問題以及解決過程
當運行代碼java Calc 3 * 2
,時報錯,對其他的運算符都能正常運行出結果,只有*
運算符不可以,我在Ubuntu
和Windows
的命令行中都運行了一遍,但都會報錯。
我通過JDB
調試,print args[]
中的數值時,args[1]
,args[2]
的數據出錯。
所以我認為傳入的數據中含有*
的原因,所以我用x
代替了*
進行傳值。最後結果正常。
代碼鏈接
- 簡易計算器代碼鏈接
mini dc代碼鏈接
心得體會
在做簡易計算器和mini dc程序時,主要是對堆棧這一數據結構的靈活使用,以後多多練習,可以寫出四則混合運算,把計算優先級考慮進去。
mini dc與簡易計算器 20165235