棧的應用--逆波蘭表達式

四則運算的中綴表達式轉後綴表達式

實現規則:

  • 數字直接輸出
  • 非數字,棧爲空或者棧頂元素爲左括號或者該符號爲左括號,直接入棧
  • 如果是右括號,持續出棧並輸出符號,直到棧頂元素爲左括號,將左括號出棧(左括號只出棧,不輸出,右括號不入棧)
  • 遇到運算符並且棧非空,如果棧頂元素的運算優先級大於等於該運算符的優先級,則持續出棧並輸出符號,直到棧頂元素優先級小於該運算符的優先級,將該運算符入棧
  • 讀到末尾,將棧中所有元素依次輸出

代碼塊

代碼塊java代碼,例如:

/**
 *
 *@Description:中綴表達式  轉  後綴表達式,運算符包含'+','-','*','/','(',')';
 *
 *@date:2017年11月7日
 *@author:cdy
 *
 */
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class ReversePolishNotation {
    static Stack<Character> symbolStack = new Stack<>();
    static StringBuilder reversePolishNoation = new StringBuilder();

    /**
     * 定義運算符優先級
     * @param c
     * @return
     */
    static int priority(char c) {
        if (c == '(') {
            return 0;
        } else if (c == '+' || c == '-') {
            return 1;
        } else if (c == '*' || c == '/') {
            return 2;
        }
        return 0;
    }

    /**
     * 中綴表達式轉  後綴表達式
     * @param expression
     * @return
     */
    public static String getReversePolishNotation(String expression) {
        int length = expression.length();
        for (int i = 0; i < length; i++) {
            // 本次輸入字符
            char c = expression.charAt(i);
            if (Character.isDigit(c)) {
                // 數字直接輸出
                reversePolishNoation.append(c);
            } else {
                // 輸入爲運算符
                if (symbolStack.isEmpty() || symbolStack.peek() == '(' || c == '(') {
                    // 如果棧爲空或者棧頂爲'('或者本次輸入運算符爲'(',直接入棧,進行下一次
                    symbolStack.push(c);
                    continue;
                }
                if (c == ')') {
                    // 如果輸入運算符爲')'
                    while (symbolStack.peek() != '(') {
                        // 棧頂不是'('
                        // 運算符持續出棧並輸出
                        char ch = symbolStack.pop();
                        reversePolishNoation.append(ch);
                    }

                    // 棧頂爲'('出棧不輸出,進行下一次
                    symbolStack.pop();
                    continue;

                }
                // char top = symbolStack.peek();
                // int topPriority=priority(top);
                int cPriority = priority(c);
                while (!symbolStack.isEmpty() && priority(symbolStack.peek()) >= cPriority) {
                    // 棧不爲空,棧頂元素優先級大於等於本次輸入運算符的優先級
                    // 運算符持續出棧並輸出
                    char ch = symbolStack.pop();
                    reversePolishNoation.append(ch);
                }
                // 棧頂元素優先級小於本次輸入運算符的優先級,本次輸入的運算符入棧
                symbolStack.push(c);

            }
            // 本次輸入結束
        }
        // 讀到輸入末尾,棧中所以元素依次輸出
        while (!symbolStack.isEmpty()) {
            char ch = symbolStack.pop();
            reversePolishNoation.append(ch);
        }
        return reversePolishNoation.toString();
    }

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