1. 程式人生 > 實用技巧 >棧實現字尾表示式計算

棧實現字尾表示式計算

  • 要求: 輸入一個逆波蘭表示式(字尾表示式),使用棧計算結果
  • 這裡簡化,這對整數進行計算

思路分析

  • 例如:(3+4)x5-6 對應的字尾表示式就是3 4 + 5 x 6 -,針對字尾表示式求值步驟如下:
    • 從左至右掃描,將3和4壓入棧中;
    • 遇到+運算子,因此彈出4和3(4為棧頂元素,3為次頂元素),計算出3+4的值7,再將7入棧;
    • 繼續掃描,將5入棧;
    • 接下來就是x運算子,因此彈出5和7,計算7x5 = 35,將35入棧
  • 將6入棧;
  • 最後是 - 運算子,計算35-6 = 29的值.

程式碼實現

public class PolandNotation {
    public static void main(String[] args) {
        String suffixExpression = "30 4 + 5 * 6 -";
        //將字尾表示式儲存到ArrayList中
        List<String> list = getListString(suffixExpression);
        //初始化一個棧
        Stack<String> stack = new Stack<>();
        //遍歷字尾表示式陣列
        for (String s : list) {
            if (s.matches("\\d+")){
                stack.push(s);
            }else {
                //出站兩個元素
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());
                //計算兩個數
                int res = calculate(num1,num2,s);
                //將返回值壓棧
                stack.push(""+res);
            }
        }
        System.out.printf("計算結果為:%d\n",Integer.parseInt(stack.pop()));
    }

    /**
     *
     * @param num1 先出棧的數
     * @param num2 後出棧的數
     * @param s 操作符
     * @return 但會兩個數運算後的結果
     */
    private static int calculate(int num1, int num2, String s) {
        int res = 0;
        switch (s){
            case "+":
                res = num2 + num1;
                break;
            case "-":
                res = num2 - num1;
                break;
            case "*":
                res = num2 * num1;
                break;
            case "/":
                res = num2 / num1;
                break;
            default:
                break;
        }

        return res;
    }

    /**
     *
     * @param suffixExpression 字尾表示式
     * @return  返回轉換後的list陣列
     */
    private static List<String> getListString(String suffixExpression) {
        List<String> list = new ArrayList<>();
        String[] s = suffixExpression.split(" ");
        for (String s1 : s) {
            list.add(s1);
        }
        return list;
    }
}