【Lintcode】370. Convert Expression to Reverse Polish Notation

題目地址:

https://www.lintcode.com/problem/convert-expression-to-reverse-polish-notation/description

給定一箇中綴表達式,要求將其轉化爲後綴表達式。

經典的做法是用棧。以一個棧st保存操作符(這裏操作符包括括號。但實際算法中只存左括號不存右括號),再以一個list(變量名爲res)存最後的後綴表達式。具體算法如下:
1、如果遇到操作數或者左括號,則直接進res
2、如果遇到右括號,則將棧中(到棧頂的所有操作符都彈出來append到res後面;
3、如果遇到操作符,則比較該操作符與棧頂的優先級,如果棧頂優先級高或等於該操作符,則將棧頂彈出並append到res後面,直到棧頂優先級低於該操作符爲止,再將該操作符進棧。由於左括號在遇到右括號之前是不會彈出的,所以很自然地規定左括號優先級最小。

如此這般直到中綴表達式被遍歷完畢。代碼如下:

import java.util.*;

public class Solution {
    /**
     * @param expression: A string array
     * @return: The Reverse Polish notation of this expression
     */
    public List<String> convertToRPN(String[] expression) {
        // write your code here
        List<String> res = new ArrayList<>();
        // 開一個哈希表記錄每個操作符的優先級。數字大者優先級高
        Map<String, Integer> prec = new HashMap<>();
        prec.put("(", 1);
        prec.put("+", 2);
        prec.put("-", 2);
        prec.put("*", 3);
        prec.put("/", 3);
        
        Deque<String> stack = new ArrayDeque<>();
        for (String s : expression) {
            if (!prec.containsKey(s) && !")".equals(s)) {
            	// 如果是操作數則直接append到res後面
                res.add(s);
            } else if ("(".equals(s)) {
            	// 如果是左括號則直接進棧
                stack.push(s);
            } else if (")".equals(s)) {
            	// 如果是右括號,則將左括號以上的所有操作符append到res後面,並把左括號自己也出棧
                while (!"(".equals(stack.peek())) {
                    res.add(stack.pop());
                }
                stack.pop();
            } else {
            	// 如果遇到操作符,則將棧頂開始所有優先級更高的或相等的操作符都出棧append到res後面;
            	// 接着再把新來的操作符入棧
                while (!stack.isEmpty() && prec.get(stack.peek()) >= prec.get(s)) {
                    res.add(stack.pop());
                }
                stack.push(s);
            }
        }
        // 最後把從棧頂到棧底的所有操作符append到res後面
        res.addAll(stack.pop());
        
        return res;
    }
}

時空複雜度O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章