首頁 後端開發 Python教學 深度解析四則運算

深度解析四則運算

Mar 26, 2017 pm 04:50 PM
四則運算

怎麼將字串的算數表達式計算出來?

如果使用正規表示式來匹配,有點不怎麼好想,而且一般想法設計到遞歸,而在Python中是非常不建議使用遞歸的,

因為它不僅有遞歸深度的限制(一般是1000個棧幀),而且不支援尾遞歸優化。

最簡單的方法就是先將表達式轉換為前綴表達式,然後透過前綴表達式來計算出結果。

前綴表達式(運算子中前面)也被稱為波蘭式,對應的後綴表達式(運算子中後面)也被成為逆波蘭式,而我們生活中,還有

常見的大多數程式語言中使用的都是中綴表達式。

中綴表達式轉換為前綴表達式規則:

  (1) 初始化兩個堆疊:運算子堆疊S1和儲存中間結果的堆疊S2;

  ( 2) 從右到左掃描中綴表達式

  (3) 遇到運算元時,將其壓入S2

  (4) 遇到運算子時,比較其與S1棧頂運算子的優先權

  (4-1) 如果S1為空,或棧頂運算子為右括號“)”,則直接將此運算子入棧

  (4-2) 否則,若優先權比棧頂運算子的較高或相等,也將運算子壓入S1

  (4-3) 否則,將S1棧頂的運算子彈出並壓入到S2中,

  再次轉到(4-1)與S1中新的棧頂運算子相比較

  (5) 遇到括號時:

  (5-1) 若是右括號「)」,則直接壓入S1

  (5-2) 若是左括號「(」,則依序彈出S1棧頂的運算子,並壓入S2,直到遇到右括號為止,

  此時將這一對括號丟棄

  (6) 重複步驟(2)至(5),直到表達式的最左邊

  (7) 將S1中剩餘的運算子依序彈出並壓入S2

  (8) 依序彈出S2中的元素並輸出,結果即為中綴表達式對應的前綴表達式。 #範例:

將轉換到的前綴表達式堆疊進行運算就簡單了

(1)初始化一個新列表

深度解析四則運算 (2)從右往左遍歷前綴表達式列表,遇到數字,存到新列表中

(3)遇到運算符,就彈出新列表中的前兩個數字,進行運算,再將結果保存到新列表中

(4)直到新列表中遍歷完前綴表達式列表,此時新列表中就只有一個元素,就是最終的結果

def mid_to_prev(expressions: str):
    priority = {  # 运算符的优先级
        "/": 1,
        "//": 1,
        "*": 1,
        "%": 1,
        "+": 0,
        "-": 0,
        "**": 2 }
    expression_list = expressions.split() # 
    number_stack = [] # 数字栈
    symbol_stack = [] # 运算符栈
    for x in expression_list[::-1]:
        if x.isdigit():             
            number_stack.insert(0, x)  # 如果是整数直接存进去
        else:
            if x == '(':         # 如果是 ( 弹出运算符栈中的运算符直到遇到 ( 
                pop_symbol = symbol_stack[0]
                while pop_symbol != ')':
                    pop_symbol = symbol_stack.pop(0)
                    number_stack.insert(0, pop_symbol)
                    pop_symbol = symbol_stack[0]
                else:
                    symbol_stack.pop(0)
            elif len(symbol_stack) == 0 or symbol_stack[0] == ')' or x == ')' or priority[x] >= priority[symbol_stack[0]]:
                symbol_stack.insert(0, x)  # 当符号栈为空 或者 遇到 ) 或者栈顶的符号是 ) 或者优先级大于等于符号栈顶的运算符优先级 直接存进去

            elif priority[x] < priority[symbol_stack[0]]:  # 优先级小于符号栈顶元素的时候
                while symbol_stack[0] != &#39;)&#39; and priority[x] < priority[symbol_stack[0]]:
                    number_stack.insert(0, symbol_stack.pop(0))
                else:
                    symbol_stack.insert(0, x)
    else:
        while len(symbol_stack) != 0:
            number_stack.insert(0, symbol_stack.pop(0))
    return number_stack
登入後複製

得到總的結果:

def calc(number1,number2,calc): # 两个数运算
    if calc == &#39;/&#39;:
        return number1 / number2
    elif calc == &#39;*&#39;:
        return number1 * number2
    elif calc == &#39;//&#39;:
        return number1 // number2
    elif calc == &#39;**&#39;:
        return number1 ** number2
    elif calc == &#39;%&#39;:
        return number1 % number2
    elif calc == &#39;+&#39;:
        return number1 + number2
    elif calc == &#39;-&#39;:
        return number1 - number2
登入後複製

實例:

前面的前綴表達式結果:

##經驗證結果是正確的。

以上是深度解析四則運算的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言如何實現四則運算 Go語言如何實現四則運算 Dec 21, 2023 pm 04:46 PM

在Go語言中,四則運算是透過基本的算術運算子來實現的。常用的四則運算運算:1、加法(+): 用於將兩個數相加;2、減法(-): 用於將第二個數從第一個數中減去;3、乘法(* ): 用於將兩個數相乘;4、除法(/): 用於將第一個數除以第二個數。

用Go語言寫的四則運算庫:簡單又有效率的數學計算工具 用Go語言寫的四則運算庫:簡單又有效率的數學計算工具 Dec 23, 2023 am 11:49 AM

用Go語言寫的四則運算庫:簡單又有效率的數學運算工具隨著電腦科技的不斷進步,數學運算在我們日常生活和工作中扮演著越來越重要的角色。無論是進行複雜的數據分析,或是進行簡單的數據處理,數學計算都是不可或缺的一環。為了提高計算效率和準確度,我們需要依賴高品質的數學計算工具。而Go語言作為一門現代化、高效能的程式語言,提供了豐富而強大的工具來進行數學運算。本文將介

使用Go語言實作一個基本的算術運算器 使用Go語言實作一個基本的算術運算器 Dec 23, 2023 pm 02:52 PM

Go語言是一種開源的、靜態類型的編譯型語言,以其簡潔、高效和易於擴展的特性而受到廣泛關注和使用。本文將介紹如何使用Go語言編寫一個簡單的四則運算計算器,並提供具體的程式碼範例。首先,我們需要定義幾個基本的資料結構來表示運算表達式和運算子。我們可以使用結構體來表示運算子和操作數,並使用枚舉類型來限制運算子的取值範圍。 typeOperatorintcons

Go語言四則運算的簡單入門指南 Go語言四則運算的簡單入門指南 Feb 19, 2024 pm 12:18 PM

入門指南:從零開始學習Go語言四則運算的實現步驟Go語言作為一種簡潔、高效的程式語言,越來越受到程式設計師的喜愛。在Go語言中實現四則運算並不複雜,本文將從零開始,一步一步地引導您學習Go語言中如何實現四則運算。本文將包括具體的程式碼範例,幫助您更好地理解每個步驟的實現方式。步驟一:創建一個新的Go語言專案首先,我們需要建立一個新的Go語言專案。在命令列中執行以下

學習Go語言中四則運算的原理與實踐 學習Go語言中四則運算的原理與實踐 Dec 23, 2023 pm 01:07 PM

標題:透過Go語言學習四則運算的原理與實作引言:Go語言是一種編譯型、並發性高的開源語言,它簡潔、可靠、有效率。透過Go語言學習四則運算的原理與實踐,不僅可以深入理解基本的數學運算規則,還能鍛鍊程式設計思維與技巧。本文將介紹四則運算的基本原理,並以Go語言編寫範例程式碼示範四則運算的實作過程。一、四則運算的基本原理四則運算是數學中最基本的運算方式,包括加法、減法、乘

Go語言基礎教學:四則運算的實作方法 Go語言基礎教學:四則運算的實作方法 Dec 23, 2023 am 09:00 AM

Go語言基礎教學:四則運算的實作方法,需要具體程式碼範例引言:Go語言作為一門開發雲端原生應用的程式語言,受到越來越多開發者的青睞。作為學習Go語言的初學者,掌握基本的運算操作是不可或缺的。本文將介紹Go語言下實作四則運算的基本方法,並提供具體的程式碼範例。加法運算加法運算是最簡單的運算運算之一,我們可以使用加號(+)來表示加法運算。下面是一個範例程式碼:packag

深入探索:Go語言四則運算的實現原理 深入探索:Go語言四則運算的實現原理 Feb 21, 2024 am 08:57 AM

Go語言作為一種開源的程式語言,在其設計之初就考慮了簡潔、高效和易於使用的特點,讓程式設計師能夠更有效率地編寫程式碼。在Go語言中,四則運算是程式設計中常見的操作之一,本文將深入探討Go語言四則運算的實作原理,並給出具體的程式碼範例。首先,我們需要了解Go語言中四則運算的基本運算符,包括加法(+),減法(-),乘法(*),除法(/)。 Go語言中的四則運算與其他程式設計

學習Go語言實現四則運算的快速入門 學習Go語言實現四則運算的快速入門 Feb 19, 2024 pm 02:59 PM

快速上手Go語言四則運算的實作方法在學習新的程式語言時,掌握基本的四則運算是非常重要的一步。本文將簡單介紹在Go語言中實作四則運算的方法,並提供具體的程式碼範例。 Go語言是一種簡潔、有效率的程式語言,由Google開發並推廣。它包含了豐富的標準函式庫,同時也具有物件導向、並發程式設計等強大特性,適合用於各種類型的應用程式開發。實現四則運算的基本原理是利用Go語言的基本

See all articles