數學表示式轉換成字尾式 逆波蘭式 ,對字尾式進行計算

時間 2021-10-20 12:21:25

1樓:匿名使用者

逆波蘭式也叫字尾表示式(將運算子寫在運算元之後)

如:我們平時寫a+b,這是中綴表示式,寫成字尾表示式就是:ab+

(a+b)*c-(a+b)/e的字尾表示式為:

(a+b)*c-(a+b)/e

→((a+b)*c)((a+b)/e)-

→((a+b)c*)((a+b)e/)-

→(ab+c*)(ab+e/)-

→ab+c*ab+e/-

試驗目的

對於實現逆波蘭式演算法,難度並不大,但為什麼要將看似簡單的中序表示式轉換為複雜的逆波蘭式?原因就在於這個簡單是相對人類的思維結構來說的,對計算機而言中序表示式是非常複雜的結構。相對的,逆波蘭式在計算機看來卻是比較簡單易懂的結構。

因為計算機普遍採用的記憶體結構是棧式結構,它執行先進後出的順序。通過試驗掌握棧的資料結構在計算機中應用。

試驗思路

將一個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:

1)首先構造一個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。

(2)讀入一個用中綴表示的簡單算術表示式,為方便起見,設該簡單算術表示式的右端多加上了優先順序最低的特殊符號「#」。

(3)從左至右掃描該算術表示式,從第一個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。

(4)如果不是數字,該字元則是運算子,此時需比較優先關係。

做法如下:將該字元與運算子棧頂的運算子的優先關係相比較。如果,該字元優先關係高於此運算子棧頂的運算子,則將該運算子入棧。

倘若不是的話,則將棧頂的運算子從棧中彈出,直到棧頂運算子的優先順序低於當前運算子,將該字元入棧。

(5)重複上述操作(1)-(2)直至掃描完整個簡單算術表示式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表示式轉化為逆波蘭表示的簡單算術表示式。

下面以(a+b)*c為例子進行說明:

(a+b)*c的逆波蘭式為ab+c*,假設計算機把ab+c*按從左到右的順序壓入棧中,並且按照遇到運算子就把棧頂兩個元素出棧,執行運算,得到的結果再入棧的原則來進行處理,那麼ab+c*的執行結果如下:

1)a入棧(0位置)

2)b入棧(1位置)

3)遇到運算子「+」,將a和b出棧,執行a+b的操作,得到結果d=a+b,再將d入棧(0位置)

4)c入棧(1位置)

5)遇到運算子「*」,將d和c出棧,執行d*c的操作,得到結果e,再將e入棧(0位置)

經過以上運算,計算機就可以得到(a+b)*c的運算結果e了。

試驗分析

逆波蘭式除了可以實現上述型別的運算,它還可以派生出許多新的演算法,資料結構,這就需要靈活運用了。逆波蘭式只是一種序列體現形式。

2樓:匿名使用者

中綴表示式如1*2+(2-1), 其運算子一般出現在運算元之間, 因此稱為中綴表示式,也就是大家程式設計中寫的表示式。編譯系統不考慮表示式的優先順序別, 只是對表示式從左到右進行掃描, 當遇到運算子時, 就把其前面的兩個運算元取出, 進行操作。為達到上述目的, 就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示式

1*2+(2-1), 就變為12*21-+;

字尾表示式中不含有括號, 且字尾表示式的運算元和中綴表示式的運算元排列次序完全相同, 只是運算子的次序發生了改變。我們實現的時候,只需要用一個特定工作方式的資料結構(棧),就可以實現。

其中stack op;用來存放運算子棧。陣列ans用來存放字尾表示式。

演算法思想:

從左到右掃描中綴表示式,是運算元就放進陣列ans的末尾。

如果是運算子的話,分為下面3種情況:

1)如果是『(』直接壓入op棧。

2)如果是『)』,依次從op棧彈出運算子加到陣列ans的末尾,知道遇到'(';

3) 如果是非括號,比較掃描到的運算子,和op棧頂的運算子。如果掃描到的運算子優先順序高於棧頂運算子

則,把運算子壓入棧。否則的話,就依次把棧中運算子彈出加到陣列ans的末尾,直到遇到優先順序低於掃描

到的運算子,並且把掃描到的運算子壓入棧中。

就這樣依次掃描,知道結束為止。

如果掃描結束,棧中還有元素,則依次彈出加到陣列ans的末尾,就得到了字尾表示式。

我空間裡面有詳細介紹,中綴轉換字尾的**和問題描述,主要是理解演算法的思想,和資料結構,這樣才算掌握了。

3樓:匿名使用者

1 讀入運算物件,直接輸出

2 ( 運算子進棧

3 ) 運算子,棧內的最上一個( 以上的運算子退棧,(也退棧

4 讀入運算子,進入運算棧

4.1 後進棧的運算子 > 先進棧的運算子,運算子進棧 (優先順序比較)

4.2 後進棧的運算子 <= 先進棧的運算子,將棧內的運算子退棧輸出,再進棧

5 # 結束符

這裡關鍵是運算子的優先順序,運算子比較少比較簡單,否則確定相互的優先順序可能會麻煩點。'('是個特殊的符號,一直留在棧中直至『)』出現,它不受優先順序進出棧的影響。**如下:

#include

#include

#include

#include

using namespace std;

int getpriority(char op);

int main()

;// if is ')'

if (expr[i] == ')')

;operators.pop();

continue;

};// if nomarl operators

if ((getpriority(expr[i]) <= getpriority(operators.top())) &&

(expr[i] != '('))

operators.push(expr[i]);

};--n;

cout << endl;

};return 0;

};int getpriority(char op);};

4樓:

一、問題的描述以及設計思路

1、問題的描述

表示式計算是掌握程式設計語言的重要部分之一,也是堆疊的應用的一個典型例子。設計一個程式,演示用算符優先法對算術表示式求值的過程。為增加系統設計的可擴充套件性,對本設計系統增加乘方(^)運算,以及增加對小數的支援能力。

系統測試採用題目要求的資料,同時測試系統對乘方以及對小數的支援,自己增加測試資料。以達到系統設計的正確性。同時為提高自己編寫實際應用程式的能力,為以後的學習以及就業作好準備,在程式的編寫中儘量與專業的程式設計規範靠攏,本系統**的書寫採用結構化的程式設計方式,力求設計**以及註釋等規範,符合要求,同時提高自己的程式設計能力。

2、設計思路

系統設計題目的要求是使用堆疊,完成算術表示式的由中綴表示式轉換成字尾表示式,為以後的表示式求值做準備。實驗中最重要的部分我認為應當是表示式的轉換過程,通過運算子優先順序別的比較完成字尾表示式的轉換。運算子的優先順序的比較通過特定的**形式形成直觀的概念,增加對乘方的支援,在實際設計過程中體現的是優先順序比較函式。

由於本系統中增加了對小數部分的支援,不僅僅侷限於一位整數部分。因此對小數部分的轉換也是本系統設計的一個難點。設計思路的詳細表達為以下內容:

a) 、定義一個字元型陣列,要求陣列足夠大,能夠完全存放下輸入的表示式。

b) 、定義一個運算子優先順序比較的函式,並且完成函式的設計。

c) 、依次掃描輸入的字元序列,當掃描到的是數字時,放入已事先定義好的字元型的佇列中。

d) 、將字元型佇列的元素值轉化成雙精度型資料並且存放在另外一個堆疊中。

e) 、當掃描到的是運算子時,進行運算,取堆疊中的兩個double型資料作為運算數。將運算結果壓棧,作為以後運算的運算元。

f) 當字元序列掃描完成以後,堆疊中存放的就是最後的運算結果,將運算結果進行輸出,即得到最終結果。

二、設計的詳細過程

。。。。

**略。。。

三、結論及體會

1、實驗結論

a)、實驗完成了題目的要求,並且根據實際情況增加了對小數的支援。而輸入的數字的個數也不限制於一位,擴充套件到多位,具體位數由雙精度數的限制決定。

b)、編寫**基本上能夠滿足程式設計規範的要求,**的變數命名,以及註釋的書寫,基本能按照要求進行。

b)、將資料結構中的佇列和堆疊的知識複習到,並且學會創新,在**的編寫中,學習了程式設計規範,學習了結構化程式設計。

2、實驗體會

a)、通過本設計實驗將資料結構中的堆疊和佇列的知識複習到,並且能夠自己設計一些東西,學會了在設計實驗過程時的基本步驟。基本上能夠有條理的解決這些問題。

b)、在試驗中遇到了很多的問題,都是以前沒有發現的,這些問題設計的方面很多,有以前的c++基礎的,也有最近學習的資料結構的知識。通過實驗的設計,讓我發現了自己的不足。自己在學習知識上面的漏洞。

希望通過彌補這些發現的漏洞,提高自己的專業知識水平。

c)、設計過程中的解決問題的方法,讓我明白瞭如何學習會更有效。如何學習才不會耽誤太多的時間。也學會了解決問題的一般方法:向老師、同學請教,藉助網路等等。

d)、實驗過程中也走了很多的彎路,由於在開始設計的時候思路不時很清晰,對於一些問題不能很好的提出解決問題的方法,在設計過程中,**總是重複的修改,並且由於不能再以各高度上給自己編寫的**進行一個評價,在很多問題上,**並不時最優的。相信在以後的學習中,隨著知識的增多,問題會逐漸得到解決。

C 字尾表示式轉中綴表示式

我公司使用的編碼規範,不方便發太多,你借鑑一下吧 規則 6 2 在表示式中使用括號,使表示式的運算順序更清晰。由於將運算子的優先順序與結合律熟記是比較困難的,為了防止產生歧義並提高可讀性,即使不加括號時運算順序不會改變,也應當用括號確定表示式的操作順序。正例 if iyear 4 0 iyear 1...

pid控制的表示式,pid控制的數學表示式

理想pid和不完全微分pid表示式 pid控制的數學表示式 墨汁諾 pid控制器的輸出為 誤差乘比例係數kp ki 誤差積分 kd 誤差微分。kp e ki edt kd de dt 版 式中的t為時間,即對權時間積分 微分 上式為三項求和。pid控制器由比例單元 p 積分單元 i 和微分單元 d ...

c語言字尾表示式求值詳細程序,可執行的

什麼字尾表示式?檔名的字尾?c語言資料結構 字尾表示式求值 char a 10 11 字串自動以 0 結束 c語言資料結構實現字尾表示式求值 這個我會,可以幫你寫!維繫一個棧,表示式一個指標從前遍歷到最後,是數的話,就壓棧。是運算的話,就退棧 計算,並將結果壓縮。計算機算這個很簡單 資料結構c語言版...