深度解析四則運算
如果使用正規表示式來匹配,有點不怎麼好想,而且一般想法設計到遞歸,而在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] != ')' 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 == '/': return number1 / number2 elif calc == '*': return number1 * number2 elif calc == '//': return number1 // number2 elif calc == '**': return number1 ** number2 elif calc == '%': return number1 % number2 elif calc == '+': return number1 + number2 elif calc == '-': return number1 - number2
實例:
前面的前綴表達式結果:
##經驗證結果是正確的。以上是深度解析四則運算的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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

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