76C語言實現表示式計算

2021-07-26 20:36:30 字數 1953 閱讀 3188

一、設計思想;兩種演算法首先都要建立兩個棧,乙個是存放運算元的數;中綴轉字尾再計算的演算法;此演算法的基本思路是先將中綴表示式轉換成字尾表示式;首先,用乙個char陣列將中綴表示式讀入,對陣列;第二步,讀出字尾表示式並進行計算;邊轉換邊計算的演算法;此演算法的基本思路是將中綴表示式按照轉換字尾的表達;首先,用乙個char陣列將中綴表示式讀入,對陣列;為了方便計算,計算

一、設計思想

兩種演算法首先都要建立兩個棧,乙個是存放運算元的數棧odstack,乙個是存放運算子的符棧opstack。數棧採用double型的用來存放浮點數,符棧採用char型的用來存放運算子,由於考慮到運算子有優先順序的問題,所以事先做了乙個type用來儲存運算子的優先順序。棧建立好了之後做棧的相關操作,初始化棧,入棧,出棧,看棧頂。其中入棧要判滿,出棧和看棧頂要判空。

中綴轉字尾再計算的演算法。

此演算法的基本思路是先將中綴表示式轉換成字尾表示式,之後再利用字尾表示式的演算法對表示式進行計算。

首先,用乙個char陣列將中綴表示式讀入,對陣列中的每乙個元素進行處理,區分哪些是數,哪些是運算子。如果是數元素(或小數點元素),則依次存入用來儲存字尾表示式的char陣列,直到乙個整合數存完之後用空格將其與後面的元素分開。如果是運算子元素,則根據當前運算子的優先順序和棧裡面的運算子的優先順序進行處理。如果棧內元素的優先順序小於當前元素的優先順序或者棧內為空,則將當前運算子入棧;如果棧內元素的優先順序大於等於當前元素的,則依次將出棧元素存入字尾表示式,並用空格將其與後面的元素分開,直到棧內元素的優先順序小或者棧內為空。對於左括號來說,無條件進棧,並只在有右括號出現的時候才有可能出棧。對於右括號來說,無條件讓棧內元素出棧,直到左括號出棧。依次將每個元素進行處理直到中綴表示式索引完畢。至此,已經實現了將中綴表示式轉換成了字尾表示式,在陣列的最後加上結束符以便下一步的呼叫。

第二步,讀出字尾表示式並進行計算。如果索引到空格則將索引標誌後推1位。之後要先對char型的數字元素進行整合,從字尾表示式中依次取出數字元素(連同小數點)存入乙個新的char型陣列,直到一整個數取完後通過atof函式將char型轉換成浮點型存入數棧,並將新陣列初始化用來儲存下乙個數。如果是索引到運算子,則在數棧中出棧兩個數字與當前運算子進行運算,先出棧的數字放在運算子後面,後出棧的數字放在運算子的前面,將運算以後的結果再次存入數棧。依次進行計算直到字尾表示式索引完畢。此時對棧內剩餘元素進行操作。每在符棧出棧乙個運算子,就從數棧出棧兩個數進行計算,演算法同上,將運算以後的結果再次存入數棧。迴圈操作直到符棧棧空,此時數棧出棧元素即為最後結果。

邊轉換邊計算的演算法。

此演算法的基本思路是將中綴表示式按照轉換字尾的表示式的方法逐步進行,邊轉換邊進行計算和儲存。

首先,用乙個char陣列將中綴表示式讀入,對陣列中的每乙個元素進行處理,區分哪些是數,哪些是運算子。如果是數元素(或小數點元素),則利用如上演算法先進行元素整合,並將整合的元素通過atof函式將char型轉換成浮點型存入數棧,並將新陣列初始化用來儲存下乙個數。如果是索引到運算子,則要先根據當前運算子的優先順序和棧裡面的運算子的優先順序進行處理。如果棧內元素的優先順序小於當前元素的優先順序或者棧內為空,則將當前運算子入棧;如果棧內元素的優先順序大於等於當前元素的,則依次出棧元素進行計算。每次計算要在數棧出棧兩個整合後的數,先出棧的數字放在運算子後面,後出棧的數字放在運算子的前面,將運算以後的結果再次存入數棧。如果遇到左括號則無條件進棧,並只在有右括號出現的時候才有可能出棧。如果遇到右括號,則無條件讓棧內元素出棧進行計算,直到左括號出棧為止。如此計算將表示式所有元素全部索引。之後再對棧內剩餘元素進行操作。每在符棧出棧乙個運算子,就從數棧出棧兩個數進行計算,演算法同上,將運算以後的結果再次存入數棧。迴圈操作直到符棧棧空,此時數棧出棧元素即為最後結果。

為了方便計算,計算過程使用了函式體。主函式只負責輸入中綴表示式和輸出最後的運

算結果。同時,建立了優先順序函式使用了swich語句為每個運算子賦值優先順序,方便在計算過程中直接呼叫。也建立了運算函式對每個運算子做特定的運算,也是使用了swich語句。 另外,最後為了能夠識別一些錯誤,在運算過程中加入了錯誤的判定,比如出棧時棧空或者左右符號不符等。在編寫過程中發現數棧的看棧頂沒有使用過,所以刪除了數棧的看棧頂。

計算字尾表示式 C語言實現

程式相對簡單易懂,執行程式,在命令列中輸入 123 注意 由於輸入字元,以 結束 輸出 5.000000 include include typedef struct stack 建立乙個棧,100為maxsize,define無法定義 void createstack stack s 棧頂指標 f...

c語言實現表示式求值

用c語言實現表示式求值演算法。要求從鍵盤輸入任意的包含加減乘除的算術四則運算表示式,都能求值。運算元型別可以設定為double。陣列棧進行操作 加減乘除和括號運算 include include include define max size 50double stacks max size cha...

7 6 字尾表示式計算

kunkun學長覺得應該讓學弟學妹了解一下這個知識點 字尾表示式相對於中綴表示式更容易讓計算機理解和學習。現在kunkun學長給出一串字尾表示式,你能幫他算出這個字尾表示式的值嗎?輸入格式 第一行輸入字尾表示式長度n 1 n 25000 第二行輸入乙個字串表示字尾表示式 每個資料或者符號之間用逗號隔...