1. 程式人生 > >棧的應用——字尾表示式的計算

棧的應用——字尾表示式的計算

## 一、字尾表示式的計算方法 ##

  • 給出一個算式,如:(3 * 4-(2+5)) * 4 / 2,其等價的字尾表示式為:3 4 * 2 5 + - 4 * 2 /;計算方法為從左到右掃描字尾表示式,遇到數字則入棧,遇到運算子則將棧中的數字出棧,第一個出棧的數字充當第二個運算數,第二個出棧的數字充當第一個運算數,與運算子作運算,並將結果入棧,最後棧中剩下的那個數就是運算結果。

二、程式碼實現

  • PostfixTester.java
import java.util.Scanner;

public class PostfixTester {

    /**
     * @param
args */
public static void main(String[] args) { String expression, again; int result; Scanner in = new Scanner(System.in); do { PostfixEvaluator evaluator = new PostfixEvaluator(); System.out.println("請輸入一個字尾表示式,用空格隔開"); System.out.println("比如:5 4 + 3 2 1 - + *"
); expression = in.nextLine(); result = evaluator.evaluate(expression); System.out.println("結果為:"+result); System.out.println("還要繼續嗎[Y/N]?"); again = in.nextLine(); } while (again.equalsIgnoreCase("y")); } }
  • PostfixEvaluator.java
import java.util.Scanner;
import java.util.Stack;

public class PostfixEvaluator {
    private final static char ADD = '+';
    private final static char SUBTRACT = '-';
    private final static char MULTIPLY = '*';
    private final static char DEVIDE = '/';

    private Stack<Integer> stack;

    public PostfixEvaluator() {
        stack = new Stack<>();
    }

    public int evaluate(String expr) {
        int op1, op2, result = 0;
        String token;
        Scanner parser = new Scanner(expr);

        while (parser.hasNext()) {
            token = parser.next();

            //判斷是否為運算子
            if (isOperator(token)) {
                //棧中資料型別為Integer,要轉換為int
                op2 = (stack.pop()).intValue();
                op1 = (stack.pop()).intValue();

                result = evaluateSingleOprator(token.charAt(0), op1, op2);
                stack.push(new Integer(result));
            } else {
                stack.push(new Integer(Integer.parseInt(token)));
            }

        }

        return result;
    }

    private int evaluateSingleOprator(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 DEVIDE:
            result = op1 / op2;
            break;

        }

        return result;
    }

    private boolean isOperator(String token) {

        return (token.equals("+") || token.equals("-") || token.equals("*") || token
                .equals("/"));
    }

}