中綴表達式轉後綴表達式

一、前置知識

在學習中綴表達式轉後綴表達式之前,需要先掌握以下幾個概念。

1、中綴表達式:指運算符在中間位置的表達式,例如1+2。

2、前綴表達式:指運算符在前面位置的表達式,例如+12。

3、後綴表達式:指運算符在後面位置的表達式,例如12+。

4、運算符優先級:指不同運算符之間的優先級大小,例如乘法的優先級高於加法。

二、中綴表達式轉後綴表達式的基本流程

1、從左到右掃描中綴表達式中的每一個數字或者運算符。

2、如果是數字,直接輸出到後綴表達式中。

3、如果是左括號,進棧。

4、如果是右括號,將左括號上面的運算符全部彈出棧並輸出到後綴表達式中,左右括號不輸出。

5、如果是運算符,如果它的優先級比棧頂的運算符高,將它壓入棧中。否則,將棧頂的運算符彈出,並輸出到後綴表達式中,直到該運算符的優先級大於棧頂運算符的優先級為止。

6、重複步驟1~5,直到中綴表達式掃描完畢。

7、將棧內剩餘的運算符依次彈出並輸出到後綴表達式中。

三、代碼實現

import java.util.Stack;
public class InfixToPostfix {
    public static void main(String[] args) {
        String infixExp = "(1+2)*3-4/5";
        String postfixExp = infixToPostfix(infixExp);
        System.out.println(postfixExp);
    }
    public static String infixToPostfix(String infixExp) {
        Stack operatorStack = new Stack();
        StringBuilder postfixExp = new StringBuilder();
        for (char ch : infixExp.toCharArray()) {
            if (ch >= '0' && ch <= '9') { // 判斷數字
                postfixExp.append(ch);
            } else if (ch == '(') { // 左括號直接進棧
                operatorStack.push(ch);
            } else if (ch == ')') { // 右括號彈出棧內全部運算符
                while (operatorStack.peek() != '(') {
                    postfixExp.append(operatorStack.pop());
                }
                operatorStack.pop(); // 彈出左括號
            } else { // 運算符
                while (!operatorStack.isEmpty() && operatorStack.peek() != '(' && priority(ch) <= priority(operatorStack.peek())) {
                    postfixExp.append(operatorStack.pop());
                }
                operatorStack.push(ch);
            }
        }
        while (!operatorStack.isEmpty()) { // 棧內剩餘的運算符全部輸出
            postfixExp.append(operatorStack.pop());
        }
        return postfixExp.toString();
    }
    private static int priority(char ch) { // 運算符優先級,數字越大,優先級越高
        if (ch == '+' || ch == '-') {
            return 1;
        } else if (ch == '*' || ch == '/') {
            return 2;
        } else {
            return 0; // 括號優先級最高
        }
    }
}

四、實例演示

例如,將中綴表達式“(1+2)*3-4/5”轉換為後綴表達式如下:

1 2 + 3 * 4 5 / –

代碼運行結果如下:

1+2 -> 12+
(1+2)*3 -> 12+3*
4/5 -> 45/
(1+2)*3-4/5 -> 12+3*45/- -> 12+3*4/5-

五、總結

中綴表達式轉後綴表達式使用了棧的思想,通過將運算符依次壓入和彈出棧來實現轉換功能。在代碼實現時,需要注意運算符優先級的大小以及左右括號的處理方式。

掌握了中綴表達式轉後綴表達式的知識後,可以在實際編程中更加輕鬆地操作表達式的計算。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/227276.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 16:28
下一篇 2024-12-09 16:28

相關推薦

  • vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常問題的解決

    本文旨在解決vue下載無後綴名的文件被加上後綴.txt,有後綴名的文件下載正常的問題,提供完整的代碼示例供參考。 一、分析問題 首先,需了解vue中下載文件的情況。一般情況下,我們…

    編程 2025-04-29
  • cmake minsizerel 後綴 d是什麼以及怎麼使用

    cmake是一個跨平台的開源編譯系統。它可以根據不同的平台、編譯器和其他參數來生成相應的Makefiles、Visual Studio工程或Xcode工程等。minsizerel是…

    編程 2025-04-27
  • Python文件選擇對話框過濾文件後綴

    在編寫Python程序時,我們常常需要打開和讀取文件,但是我們並不希望讀取某些特定格式的文件,這時候文件選擇對話框就非常有用了。本篇文章將介紹如何使用Python的文件選擇對話框並…

    編程 2025-04-27
  • 關係表達式的深度剖析

    一、關係表達式的定義 關係表達式是指在關係數據庫中為實現數據的最大效用和最快速度的數據檢索和存儲而定義的語法,表達式中的每一個元素(關係、屬性、常量等)均是數據庫的基本結構。 二、…

    編程 2025-04-23
  • Java二元表達式:從基礎到優化

    一、基礎知識 Java二元表達式是指只有兩個操作數以及一個運算符的表達式,例如1+2、a<b或 x*y 。在Java語言中,對二元表達式的處理十分重要且廣泛,我們需要掌握基礎…

    編程 2025-04-18
  • 切面表達式:細節決定成敗

    一、切面表達式註解 註解是Java中非常重要的一種語法標記,Spring AOP中也通過註解的方式來定義切面。在定義切面時,可以使用@Aspect註解表示一個切面類,也可以使用@B…

    編程 2025-04-13
  • Cron表達式校驗詳解

    一、Cron表達式簡介 Cron表達式是一種時間計劃工具。它是由6或7個時間元素組成的字符串,用於指定時間表。 Cron觸發器通常用於調度任務或批處理作業。 Cron表達式是指定執…

    編程 2025-04-12
  • 深入探究cron表達式驗證

    一、驗證cron表達式的重要性 1、cron表達式是一個非常常見的工具,用於定義如何在特定的間隔進行重複運行作業以及何時啟動作業。 2、驗證cron表達式的正確性非常重要,可以確保…

    編程 2025-02-25
  • Java表達式的全面解析

    一、操作符和操作數 在Java中,表達式是由操作符和操作數組成的。操作符分為算術操作符、關係操作符、邏輯操作符和位操作符。操作數可以是常量、變量、方法調用或者其他表達式。 //算術…

    編程 2025-02-17
  • 深入了解execution表達式

    隨着Spring框架的不斷發展,execution表達式作為Spring AOP切點表達式的核心語法之一,也逐漸成為了Java開發人員必備的技能之一。execution表達式主要作…

    編程 2025-02-17

發表回復

登錄後才能評論