實現一個簡單的 eval 函式計算加減法和括號
阿新 • • 發佈:2019-01-10
實現一個簡單的 eval 函式
題目
寫一個 eval 函式,其輸入是含有數字,加減符號和小括號的表示式字串,比如5+12-(4+21),要求輸出其值,即 eval(“5+12-(4+21)") = 8。
思路
- 由於只有加減符號,所以不用考慮其他運算子結合的優先順序
- 括號優先順序比較高,當遇到一個")"時,就計算一個括號內表示式的值
- 在沒有遇到")"的時候,可以將資料儲存到棧中。當遇到非")"時,字元進棧;否則,依次彈出字元進行計算,直到彈出"(",將計算結果進棧。注:如果查到棧頂,沒有匹配的"(",可直接報錯。
- 當遇到"\0"時,表示到字串結尾了,將棧內元素依次彈出計算,得出的結果。注:此時如果棧內仍有"(",可直接報錯,表示式錯誤。
程式碼
public static int eval(String expression) {
Stack<String> stack = new Stack<String>();
int token = 0;
for (int i = 0; i < expression.length(); i++) {// 遍歷陣列的
if (expression.charAt(i) <= '9' || expression.charAt(i) >= '0') {
token = expression.charAt(i) - '0' + token * 10; // 超過1位的數字合成
} else {// 是運算子號
// 將數字內容進棧
stack.push("" + token);
token = 0;
// 括號情況下不重複進棧
if (expression.charAt(i) == '(') {
stack.pop();
}
if (expression.charAt(i) == '+' || expression.charAt(i) == '-'
|| expression.charAt(i) == '(') {
stack.push("" + expression.charAt(i)); // 將運算子進棧
} else if (expression.charAt(i) == ')') {
// 計算括號內內容
Stack<String> tmpStack = new Stack<String>();
while (!stack.isEmpty()) {
String tmpStr = stack.pop();
if (tmpStr.equals("(")) {
break;
} else {
tmpStack.push(tmpStr);
}
}
token = Integer.valueOf(tmpStack.pop());
while (!tmpStack.isEmpty()) {
String op = tmpStack.pop();
if (op.equals("+")) {
token += Integer.valueOf(tmpStack.pop());
} else if (op.equals("-")) {
token -= Integer.valueOf(tmpStack.pop());
}
}// end while
}
}// end if-else
}// end for
// 將當前運算元進棧
stack.push("" + token);
token = 0;
// 計算棧內結果
Stack<String> tmpStack = new Stack<String>();
while (!stack.isEmpty()) {
tmpStack.push(stack.pop());
}
token = Integer.valueOf(tmpStack.pop());
while (!tmpStack.isEmpty()) {
String op = tmpStack.pop();
if (op.equals("+")) {
token += Integer.valueOf(tmpStack.pop());
} else if (op.equals("-")) {
token -= Integer.valueOf(tmpStack.pop());
}
}// end while
return token;
}