表達式求值(java)


今天去面試,考了這個,短時間沒想出來。。。

太笨了!

后來想用棧和遞歸做

但是看了網上才知道,可以將中綴表達式轉為后綴表達式,就極其方便了。

import java.util.Scanner;
import java.util.Stack;

public class ExpressionCalc {

    private Stack<Character> cStack = new Stack<Character>();
    private Stack<Integer> iStack = new Stack<Integer>();

    // 符號等級
    static int cLevel(char c) {
        switch (c) {
        case '(':
            return 0;
        case '+':
            return 1;
        case '-':
            return 1;
        case '*':
            return 2;
        case '/':
            return 2;
        }
        return 0;
    }

    // 對棧進行運算
    private void dealStack() {
        char c = cStack.pop();
        int num1 = iStack.pop();
        int num2 = iStack.pop();
        switch (c) {
        case '+':
            iStack.push(num1 + num2);
            break;
        case '-':
            iStack.push(num1 - num2);
            break;
        case '*':
            iStack.push(num1 * num2);
            break;
        case '/':
            iStack.push(num1 / num2);
            break;
        }
    }

    // 返回str的表達式的值
    public int calc(char[] exp) {
        while (!cStack.isEmpty()) {
            cStack.pop();
        }
        while (!iStack.isEmpty()) {
            cStack.pop();
        }
        cStack.push('(');

        for (int i = 0; i < exp.length; i++) {
            if (exp[i] == ' ') {
                continue;
            } else if (exp[i] > '0' && exp[i] <= '9') {
                int num = exp[i] - '0';
                while (exp[i + 1] > '0' && exp[i + 1] < '9') {
                    i++;
                    num = num * 10 + exp[i] - '0';
                }
                iStack.push(num);
            } else if (exp[i] == '(') {
                cStack.push(exp[i]);
            } else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
                while (cLevel(exp[i]) < cLevel(cStack.peek())) {
                    dealStack();
                }
                cStack.push(exp[i]);
            } else if (exp[i] == ')') {
                while (!cStack.peek().equals('(')) {
                    dealStack();
                }
                cStack.pop();
            }
        }
        return iStack.pop();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        ExpressionCalc m = new ExpressionCalc();
        while (sc.hasNext()) {
            // 程序需要前后補一個括號
            System.out.println(m.calc((sc.nextLine() + ")").toCharArray()));
        }

    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM