用python創作計算器函數簡單處理字符串形式的表達式

既然要對一個表達式進行計算,肯定要涉及對字符串的處理,和對一些數據的保存。所在我的思路里,我對數據做了一個簡單的分類。不管這個表達式有多麼複雜,只要不超出我們四則運算的範圍我們就吧當前表達式分割出來的數據分成兩類,一類是數據類,一類是符號類,將他們分別存儲在兩個線性結構中,在後期對他們進行有關聯的處理

  1. 雙棧
    數據棧
    比如表達式"1+2+3="分割出來的數據棧如下圖:
    在這裏插入圖片描述
    符棧
    同樣的表達式"1+2+3=“提取出符號的結果如下:
    在這裏插入圖片描述
    一個四則運算的表達式經過分割後整個式子以兩個棧的形式存在,這個講一個表達式分割爲兩個棧的過程叫做"生成雙棧

這是我代碼中生成雙棧的過程

def calculator(exp)#計算器函數傳入表達式(exp)
	numlist=list()#數據棧
	signlist=list()#符號棧
	num=""#數字**膠囊**
	for i in exp:#遍歷這個表達式
		if num !=""#如果當前數據叫膠囊不爲空
			if i not in "+-*/()":#如果當前字符不是符號則當前字符壓入膠囊
				num+=i
			else:#如果當前字符屬於符號則進行一下處理
				numlist.append(float(num))#將數據膠囊壓入數據棧
				#因爲一旦當前是符號就代表遍歷完了一個數字轉爲float壓入數據棧
				signlist.append(i)#講當前符號壓入符棧
				num#膠囊執行**推新**

其中提到了兩個概念膠囊推新
膠囊:
膠囊是我自己設計的一種編程名詞,當我們需要短暫累計保存一些數據時,通常需要一個變量對其進行保存,變量爲膠囊盒子,這個變量裏的元素所組成的順序整體就被我稱爲膠囊,同循環膠囊共同性質分爲修改型累積型,在累計型中膠囊多爲線性結構。
膠囊
膠囊產生後推新就應運而生,推新通常與膠囊綁在一塊,當每次我們生成膠囊,並將其壓入該壓入的地方,若爲累積型,每次則需要將膠囊盒 子清空,以積累新的數據,這個清空膠囊盒子的動作便稱爲推新
如此方法可以將任意一個四則運算表達式的符號與數據分割出來,就可以通過找到其中的一些關聯的進行聯動處理

  1. 聯動處理
    聯動實施的必要條件是所需處理的多個元素之間有所關聯,所以我們先要找到聯動元素之間的關聯,比如連個棧它們是由一個表達式所分割所生成的,我們通過觀察,數據棧和符棧長度一樣,比對原表達式我們可以發現數據棧相鄰的兩個元素的介符總對應符棧中的一個符號,並且這個符號的下標就是那兩個元素中第一個元素在數據棧的下標
    在這裏插入圖片描述

介符與相隨數
介符與相隨數的概念是表達數據在表達式之間的關係,如下圖
在這裏插入圖片描述
3. 無優先級計算
在我們瞭解了雙棧的聯動處理之後,我們瞭解了雙棧的一些關聯,比如一個四則運算表達式生成的雙棧,每兩個在數據棧上相鄰的元素的介符所在符棧所對應的下標就是那兩個元素第一個的下標,我們可以通過遍歷雙棧中的任意一棧來完成計算,這樣說太過抽象,至於如何計算,接下來就說一下怎麼利用雙棧對表達式進行計算
利用無優先級表達式所生成的雙棧對該表達式進行簡單計算
在這裏插入圖片描述
分割計算組
在這裏插入圖片描述
若以i作爲下標遍歷符棧,則符棧下標i的元素爲數據棧i和i+1下標元素的運算符。上圖就是我們的數據之間的關聯,只要通過這種方法對應符號與數據,就可以爲這些數據進行運算,每三個這樣的數據就組成一個計算組

在這裏插入圖片描述
比如上圖,我們就分割出了四個計算組,在符棧中的,在無小括號四則運算中有效運算符有"+—*/",在一其符棧中有幾個有效運算符,就可以分出幾組計算組,在無優先級的情況下,這些的計算組不必順序運算,先算哪個結果都是一樣的,由於我們通常是遍歷符棧所以我們通常是順序計算:
在這裏插入圖片描述
將第一個計算組中的符號作爲判斷,兩個數據做怎樣的運算,然後相互運算結果賦值給計算組第一個數據所在的位置,符號用過後在符棧中剔除用過的符號,符號消失了當然後面的符號就要向前移了。數據棧完成賦值後,兩個數據都沒有意義了,第一個剔除放入計算結果,第二個剔除讓後面的元素都向前移動
結果入下圖:
在這裏插入圖片描述
此時如果運算成功,則下標索引往回退一個,繼續從下標0開始遍歷
第二次:
在這裏插入圖片描述
在這裏插入圖片描述
第三次:
在這裏插入圖片描述
在這裏插入圖片描述
第四次:
在這裏插入圖片描述
在這裏插入圖片描述
通過四次的計算,每一次計算都有兩個數據經過運算產生新的數據放入原先第一個數據的位置,並且讓後面的數據先前,這個過程叫做數據沉澱,經過一輪沉澱,表達式的計算結果會沉澱到數據棧的第一個位置即"數據棧[0]"

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