1. 程式人生 > >實現一個簡單的 eval 函式計算加減法和括號

實現一個簡單的 eval 函式計算加減法和括號

實現一個簡單的 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; }