1. 程式人生 > >表示式/如何將中綴表示式轉化成字尾表示式

表示式/如何將中綴表示式轉化成字尾表示式

首先介紹下什麼是中綴表示式,字尾表示式

表示式一般分為字首表示式,中綴表示式和字尾表示式。其中我們最為熟悉的是中綴表示式,也就是書本上最常用的表示形式。中綴表示式是將運算子放在兩個運算元的中間。

字首表示式是將運算子放在兩個運算元之前。字尾表示式(又稱逆波蘭表示式)是將運算子放在兩個運算元之後。例如:中綴表示式(A+(B-C/D)*E)對應的字首表示式是(+A*-B/CDE)對應的字尾表示式為(ABCD/-E*+)。

由於字尾表示式即沒有運算優先順序又沒有括號的約束問題,並且運算子的出現順序正是實際計算的順序,所以在計算機中計算一個字尾表示式的值要比計算一箇中綴表示式的值簡單的多。

簡單的介紹下怎樣閱讀後綴表示式,或者說怎樣變成我們熟悉的中綴表示式的形式。需要注意的兩點是:1.在後綴表示式中運算子放在兩個運算物件的後面。2.所有的計算按運算子出現的順序。那麼以上邊的例子來講,字尾表示式ABCD/-E*+。

1.首先進行的除法運算,運算物件為CD,轉換為中綴表示式就是C/D。

2.第二個操作符是-,運算元是B和C/D(前面的操作部分以結果的形式看成一個整體),轉化成中綴表示式就是B-C/D。

3.第三個操作符是*,運算元是B-C/D和E(注意演算法的優先順序,前面的運算元需要加括號),轉化成中綴表示式是(B-C/D)*E。

4.第四個操作符是+,運算元是A和(B-C/D)*E,轉化成中綴表示式就是A+(B-C/D)*E。結束。

下面詳細介紹怎樣將中綴表示式轉化成字尾表示式(字尾表示式更利於計算機的計算)

我們發現中綴表示式與字尾表示式中操作數出現的順序相同,不同的是運算子的先後順序,所以轉換的重點是運算子的處理上。首先設定運算子的優先順序:

運算子
(左括號 +加,-減 *乘,/除,%取模 ^冪
優先順序 0 1 2 3

上表中的數字代表優先順序,數字越大表示優先順序越高。

要想使運算子出現的順序與真正的算數運算順序相同,就要使優先順序高的以及括號內的運算子出現在前面,在把中綴表示式轉換成字尾表示式的時候要使用一個棧來保留還未送到字尾表示式的運算子,並稱為運算子棧(利用了棧先入後出的特性)。實現轉換的基本步驟如下:

1.初始化一個運算子棧。

2.從算數表示式輸入的字串中依次從左向右每次讀取一個字元。

3.如果當前字元是運算元,則直接填寫到字尾表示式。

4.如果當前字元是(左括號,將其壓入運算子棧(第一步定義)。

5.如果當前字元為運算子,則

5.1.當運算子棧為空,則將其壓入運算子棧。

5.2.當此運算子的優先順序高於棧頂元素的時候,則將此運算子壓入運算子棧;否則,彈出棧頂運算子到字尾表示式,並且將當前運算子壓棧。回到步驟2.

6.如果當前字元是)右括號,反覆將棧頂元素彈出到字尾表示式,直到棧頂元素是左括號(為止,並將左括號從棧中彈出丟棄。

7.如果讀取還未完成,回到步驟2.

8.如果讀取完成,則將棧中剩餘的運算子依次彈出到字尾表示式。

為了方便大家理解,下面使用前面的例子看由A+(B-C/D)*E如何得到字尾表示式ABCD/-E*+的。

1.初始化一個運算子棧,不妨用st表示。

2.讀取一個字元,‘A',為運算元,直接送到字尾表示式,當前字尾表示式為A。

3.讀取下一個字元,‘+’,為操作符,且運算子棧為空,壓入操作符棧。當前操作符棧為+,字尾表示式為A。

4.讀取下一個字元,‘(’,為左括號,將其壓入操作符棧。當前操作符棧為(+,字尾表示式為A。

5.讀取下一個字元,‘B’,為運算元,直接送到字尾表示式,當前字尾表示式為AB。

6. 讀取下一個字元,‘-’,為操作符,且優先順序高於棧頂元素,壓入操作符棧。當前操作符棧為-(+,字尾表示式為AB。

7. 讀取一個字元,‘C',為運算元,直接送到字尾表示式,當前字尾表示式為ABC。

8. 讀取下一個字元,‘/’,為操作符,且優先順序高於棧頂元素,壓入操作符棧。當前操作符棧為/-(+,字尾表示式為ABC。

9. 讀取一個字元,‘D',為運算元,直接送到字尾表示式,當前字尾表示式為ABCD。

10. 讀取下一個字元,‘)’,為右括號,反覆將棧頂元素彈出到字尾表示式,直到棧頂元素是左括號(為止,並將左括號從棧中彈出丟棄。當前操作符棧為+,字尾表示式為ABCD/-。

11. 讀取下一個字元,‘*’,為操作符,且優先順序高於棧頂元素,壓入操作符棧。當前操作符棧為*+,字尾表示式為ABCD/- 。

12. 讀取一個字元,‘E',為運算元,直接送到字尾表示式,當前字尾表示式為ABCD/- E。

13. 讀取完畢,將棧中剩餘的所有運算子彈出到字尾表示式,操作符棧置空,字尾表示式為ABCD/- E*+。

轉換完成!!!

相關推薦

表示式/如何中綴表示式轉化字尾表示式

首先介紹下什麼是中綴表示式,字尾表示式。 表示式一般分為字首表示式,中綴表示式和字尾表示式。其中我們最為熟悉的是中綴表示式,也就是書本上最常用的表示形式。中綴表示式是將運算子放在兩個運算元的中間。 字首表示式是將運算子放在兩個運算元之前。字尾表示式(又稱逆波蘭表示式)是將運

資料結構中的中綴表示式轉化字尾表示式

接上一篇部落格。 已知操作符包括:+ , / , * , / , ( , ) ; 形如中綴表示式:a+b-a*((c+d)/e-f)+g 步驟 掃描項

中綴表示式轉化字尾表示式(逆波蘭表示式

1.將中綴表示式轉化為字尾表示式 字尾表示式也叫作逆波蘭表示式,主要是運用棧的後進先出思想,下面就講講我自己的思考, 假設中綴表示式為:2*(2+1)-6(4-2)#,則字尾表示式為:2 2 1 + * 6 4 2 - / -; 首先依次遍歷中綴表示式,遇到運算元字元則直接輸出(數字字元

中綴表示式轉換字尾表示式,自己寫的。

自己測試了幾個用例,都通過了。 語言是C++。 它用到的資料結構是:一個存放運算子的棧,名字是Sop,和一個存放字尾表示式的vector,名字是res。 它的規則是: 先設定好每個運算子的優先順序。 從左到右依次遍歷每一個字元。 1.遇到數字,直接放到pu

棧應用2(中綴表示式轉換字尾表示式)-筆記

問題:如何使用棧來實現將中綴轉換為字尾表示式的演算法? 解答:在討論演算法前,首先介紹中綴、字首和字尾表示式的定義 中綴:中綴表示式由一個單一字元或運算子,連線前後兩個中綴字串共同組成。 A A+B (A+B)+(C+D) 字首:字首表示式由一個單一字元或運算子,隨後是兩個字首字串共同組成。

"括號匹配, 中綴表示式轉化字尾表示式, 計算中綴表示式, 計算字尾表示式"完整程式碼

核心程式碼: ---------------- /* Calculate infix expression */ double calc_infix_expression(const char *infixexp) { Stack operator_stk, operand_stk;

中綴表示式轉換字尾表示式,進行簡單表示式的計算

分析: 步驟一:中綴表示式轉換為字尾表示式 設立一個操作符棧,用來臨時存放操作符;設定一個佇列用以存放字尾表示式序列。 從左至右遍歷中綴表示式,如果遇到運算元(需要注意的是運算元可能不止一位,因此需要一位位的讀入然後合併成整數)就將其加入到字尾

中綴表示式轉換字尾表示式並求值

#include <stack> using namespace std; bool IsOperator(char ch) { char ops[] = "+-*/"; for (int i = 0; i < sizeof(ops) / sizeof(char);

中綴、字首、字尾表示式相互相互轉換與求值

轉載至:https://www.cnblogs.com/nzbbody/p/3335226.html 表示式轉化(中綴,字尾,字首) 1、為什麼要把中綴表示式轉化為字尾,字首? 計算機沒法計算帶有括號,以及區分優先順序的表示式,或者說很難計算。使用字尾,字首,消除了括號和優先順序

棧的表示式之計算中綴、字首和字尾表示式

1.計算中綴表示式 //判斷運算子優先順序 int getPriority(char op) { if(op=='+'||op=='-') return 0; else return 1; } //計算表示式 int calsub(float opnd1,char op,fl

順序棧應用2(利用順序棧中綴式轉換前、字尾式並求值)

/* 中綴轉字首參考演算法: 1)求輸入串的逆序。(中綴轉字首是從右向左訪問表示式) 2)檢查輸入的下一元素。 3)假如是運算元,把它新增到輸出串中。 4)假如是閉括號,將它壓棧。 5)假如是運算子, i)假如棧空,此運算子入棧。 ii)假如棧頂是閉括號,此運算子入棧。 i

使用windbg在開啟PAE的情況下虛擬地址轉化物理地址

技術分享 dir halt cgroup nbsp session bre dog 格式 在開啟PAE之後,32位的線性地址的結構發生了變化,具體結構如下 30-31位:頁目錄指針表索引 21-29位:頁目錄索引 12-20位:頁表索引 0-11位:頁內偏移 在開啟PAE

杭電1717關於無限迴圈小數轉化分數

https://zhidao.baidu.com/question/7418774?qq-pf-to=pcqq.c2c 這個連結中是關於迴圈小數如何化成分數的 思路:分三種情況討論 先討論0.5 在討論後面的,遇到0.32(56)這種情況先討論括號前面的 #include #include

利用QDataStream大檔案轉化二進位制檔案QBatyArray

用QDataStream的readRawData()函式讀取二進位制的檔案,檔案過大時會造成程式崩潰,我們可以多次讀取檔案,然後將資料塊組合成整體的QByteArray QByteArray total_file; QFile file("D:/jp

POJ 2502 Subway(各種資料轉化圖+最短路+迪傑斯特拉演算法)

You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of getting to ride your bike to school every day,

matlab中如何cell陣列轉化數值型矩陣

                                     將cell陣列轉化成矩陣 1.若

js時間戳轉化日期格式

// 例子,比如需要這樣的格式:yyyy-MM-dd hh:mm:ss var date = new Date(time*1000); Y = d

轉換函式:TO_CHAR()用法之一 一個數值轉化字串

 格式:TO_CHAR(number,format) 即 TO_CHAR((數值,格式) 用法: 1、不指定格式的 TO_CHAR函式將數值轉換成簡單字串形式。         例:  TO_CHAR(123)       結果       123       

c++中怎樣字元陣列轉化字串變數

解1:首地址複製 string a; char stringarray[100]; stringarray="changestring"; a=stringarray; 解2:元素按位賦值 string a; char stringarray[100]; stringarr

面試題:輸入一個十進位制整數,這個數字轉化對應的十五進位制數(在十五進制中,A表示10,B表示11,C表示12,D表示13, E表示14),請寫入轉換程式。例如:235表示為10A;

如上是本人一位朋友的公司出的研發小測試,小朋友是一臉懵逼啊! 分析:進位制轉換思路:10進位制除以15商和餘數,反覆拿商除以15獲得商和餘數,類推,知道商為0,停止; 以235表示為10A為例分析: 235/15 = 15 餘數10 15/15 = 1 餘數