波蘭表達式的全面解析

一、波蘭表達式c

波蘭表達式也叫前綴表達式,是一種不需要括弧即可表示複雜運算的表達式。以波蘭數學家Jan Łukasiewicz的名字命名。和我們平時所寫的算術表達式中綴表達式有所不同,波蘭表達式的運算符位於操作數之前。

波蘭表達式的一般形式為:「運算符 操作數1 操作數2」 ,例如中綴表達式(1+2)*3對應的波蘭表達式為*+123。

二、波蘭表達式解析邏輯運算符

對於中綴表達式中的邏輯運算符(&&,||,!),我們可以通過波蘭表達式來替換掉這些運算符,即用對應的波蘭表達式來表示邏輯運算符的運算關係。其中,&&對應and,||對應or,!對應not,具體可以參考下表。

邏輯運算符 	中綴表達式 	波蘭表達式
&&       a && b       & a b
||       a || b       | a b
!        !a           ! a 

三、波蘭表達式代碼

下面是一個簡單的波蘭表達式計算的Python代碼示例:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token in ["+", "-", "*", "/"]:
                a = stack.pop()
                b = stack.pop()
                if token == "+":
                    stack.append(b + a)
                elif token == "-":
                    stack.append(b - a)
                elif token == "*":
                    stack.append(b * a)
                else:
                    stack.append(int(b / a))
            else:
                stack.append(int(token))
        return stack[0]

四、波蘭表達式與二叉樹

波蘭表達式可以通過二叉樹來表示,二叉樹的結點表示運算符或操作數,左結點和右結點分別表示運算符或操作數的左側和右側。二叉樹的葉結點都是操作數。比如表達式(8-3)*(2+6)的二叉樹表示如下:

            *
          /   \
        -      +
      /  \    / \
     8    3  2   6

五、波蘭表達式怎麼算

計算波蘭表達式通常使用棧來實現,從左到右遍歷表達式,如果是一個操作數,則入棧,如果是一個運算符,則取出棧頂的兩個元素進行運算,並把運算結果入棧。當表達式遍歷完成後,棧中的唯一元素就是表達式的計算結果。比如計算波蘭表達式(2,1,+,3,*)的結果可以按照以下步驟來實現:

1. 將2和1壓入棧中;
2. 彈出2和1(1在棧頂),計算2+1,結果為3,將3壓入棧中;
3. 將3和3壓入棧中;
4. 彈出3和3(3在棧頂),計算3*3,結果為9,將9壓入棧中;
5. 棧中的唯一元素9就是表達式的計算結果。

六、波蘭表達式是什麼

波蘭表達式是將運算符前置的一種數學表達式,由波蘭數學家Jan Łukasiewicz於1920年提出並命名。波蘭表達式有著與中綴表達式類似的計算結果,但由於運算符的位置不同,波蘭表達式更適用於計算機處理。

七、波蘭表達式怎麼寫

在使用時,可以按照以下步驟將中綴表達式轉換為波蘭表達式:

1. 創建一個運算符棧和一個結果棧;
2. 從左到右遍歷中綴表達式中的每個元素;
3. 如果遇到操作數,將其壓入結果棧中;
4. 如果遇到運算符,則與運算符棧頂的元素進行比較:
   4.1 如果該運算符的優先順序高於運算符棧頂的元素,則將該運算符壓入運算符棧中;
   4.2 如果該運算符的優先順序低於或等於運算符棧頂的元素,則不斷彈出運算符棧頂的元素,直到遇到優先順序低於該運算符的元素,然後將該運算符壓入運算符棧中;
5. 如果遇到左括弧,將其壓入運算符棧中;
6. 如果遇到右括弧,則連續彈出運算符棧頂元素並壓入結果棧中,直到彈出的元素是左括弧為止;
7. 遍歷完成後,如果運算符棧中仍有元素,則依次彈出並壓入結果棧中;
8. 將結果棧中的元素逆序輸出即得到波蘭表達式。

八、波蘭表達式前中後的區別

波蘭表達式有前綴、中綴和後綴(逆波蘭)三種形式,中綴表達式是人們最為熟悉的,並且使用得也最多,但計算機計算的時候需要先轉化為其他形式再進行計算。波蘭表達式與中綴表達式之間的轉換主要包括:

中綴表達式 -> 前綴表達式:使用不斷彈出棧頂元素的方法,將中綴表達式轉換為前綴表達式;
中綴表達式 -> 後綴表達式:使用不斷彈出棧頂元素的方法,將中綴表達式轉換為逆波蘭表達式;
前綴表達式 -> 中綴表達式:使用遞歸的方法將前綴表達式轉換為中綴表達式;
後綴表達式 -> 中綴表達式:使用遞歸的方法將後綴表達式轉換為中綴表達式。

九、波蘭表達式和逆波蘭表達式定義

波蘭表達式通常指前綴表達式,也稱為波蘭記法,是一種將運算符寫在前面的算術表達式。逆波蘭表達式通常指後綴表達式,也稱為逆波蘭記法,是一種將運算符寫在後面的算術表達式。逆波蘭表達式與波蘭表達式類似,但運算符位於操作數之後。例如,中綴表達式 (1+2)*(3+4) 可以寫成逆波蘭表達式 1 2 + 3 4 + *

十、波蘭表達式例題

1、LeetCode 150. Evaluate Reverse Polish Notation

給定一個代表逆波蘭表達式的字元串,求表達式的值。可以假設給定的逆波蘭表達式始終有效,且所有中間結果的計算值在範圍 [-2^31, 2^31 – 1] 內。

示例:

輸入: ["2", "1", "+", "3", "*"]
輸出: 9

AC代碼如下:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token in ["+", "-", "*", "/"]:
                a = stack.pop()
                b = stack.pop()
                if token == "+":
                    stack.append(b + a)
                elif token == "-":
                    stack.append(b - a)
                elif token == "*":
                    stack.append(b * a)
                else:
                    stack.append(int(b / a))
            else:
                stack.append(int(token))
        return stack[0]

2、LeetCode 224. Basic Calculator

給你一個字元串表達式 s ,請你實現一個基本計算器來計算並返回它的值。示例 1:

輸入:s = "1 + 1"
輸出:2

AC代碼如下:

class Solution:
    def calculate(self, s: str) -> int:
        num = 0 # 維護一個當前的數字
        stack = [1] # 維護一個存放+,-號的棧,遇到左括弧的時候入棧最後結果 * 對應的數字
        sign = 1 # 維護當前的符號
        res = 0 # 維護最終的結果
        for i in range(0, len(s)):
            if s[i].isdigit():
                num = num * 10 + int(s[i])
            elif s[i] == '+':
                res += sign * num
                num = 0
                sign = stack[-1]
            elif s[i] == '-':
                res += sign * num
                num = 0
                sign = -1 * stack[-1]
            elif s[i] == '(':
                stack.append(sign)
            elif s[i] == ')':
                stack.pop()
            else:
                continue
        res += sign * num
        return res

3、LeetCode 439. Ternary Expression Parser

給一個字元串表示一個三元表達式,求它的計算結果。表達式由字元串組成,其中的操作符將提供為字元。條件運算符 ? 總是以雙字元 ‘ ? ‘ 和 ‘ : ‘ 的形式出現在表達式中。

示例:

輸入: "T?2:3"
輸出: 2

AC代碼如下:

class Solution:
    def parseTernary(self, expression: str) -> str:
        if len(expression) == 1:
            return expression
        i = 0
        count = 0
        # 用來統計?和:的數量,記錄下當前的數字
        for i in range(len(expression)):
            if expression[i] == "?":
                count += 1
            elif expression[i] == ":":  
                count -= 1

            if count == 0:
                idx = i
                break
                
        return self.parseTernary(expression[2:idx+1]) if expression[0]=="T" else self.parseTernary(expression[idx+1:])

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

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

相關推薦

  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python zscore函數全面解析

    本文將介紹什麼是zscore函數,它在數據分析中的作用以及如何使用Python實現zscore函數,為讀者提供全面的指導。 一、zscore函數的概念 zscore函數是一種用於標…

    編程 2025-04-29
  • 全面解讀數據屬性r/w

    數據屬性r/w是指數據屬性的可讀/可寫性,它在程序設計中扮演著非常重要的角色。下面我們從多個方面對數據屬性r/w進行詳細的闡述。 一、r/w的概念 數據屬性r/w即指數據屬性的可讀…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28
  • 瘋狂Python講義的全面掌握與實踐

    本文將從多個方面對瘋狂Python講義進行詳細的闡述,幫助讀者全面了解Python編程,掌握瘋狂Python講義的實現方法。 一、Python基礎語法 Python基礎語法是學習P…

    編程 2025-04-28
  • 全面解析Python中的Variable

    Variable是Python中常見的一個概念,是我們在編程中經常用到的一個變數類型。Python是一門強類型語言,即每個變數都有一個對應的類型,不能無限制地進行類型間轉換。在本篇…

    編程 2025-04-28
  • Zookeeper ACL 用戶 anyone 全面解析

    本文將從以下幾個方面對Zookeeper ACL中的用戶anyone進行全面的解析,並為讀者提供相關的示例代碼。 一、anyone 的作用是什麼? 在Zookeeper中,anyo…

    編程 2025-04-28
  • Python合集符號全面解析

    Python是一門非常流行的編程語言,在其語法中有一些特殊的符號被稱作合集符號,這些符號在Python中起到非常重要的作用。本文將從多個方面對Python合集符號進行詳細闡述,幫助…

    編程 2025-04-28
  • Switchlight的全面解析

    Switchlight是一個高效的輕量級Web框架,為開發者提供了簡單易用的API和豐富的工具,可以快速構建Web應用程序。在本文中,我們將從多個方面闡述Switchlight的特…

    編程 2025-04-28

發表回復

登錄後才能評論