復旦16年機考題 字尾表示式求值

2021-09-11 05:47:21 字數 1377 閱讀 4692

首先回顧一下如何由中綴表示式轉為字首和字尾,以中綴表示式9+(5-4)-6+7為例。

轉為字尾表示式的規則

左到右掃瞄中綴表示式,

若遇到數字,則將其輸出。

若遇到運算子,

1.若為「(」則將其入棧。

2.若此時棧為空或者棧頂為"(",則將其入棧。

3.當前運算子優先順序大於棧頂運算子優先順序,則將其入棧,反之(也就是小於等於),則一直將棧頂運算子出棧,直到當前運算子優先順序大於棧頂運算子優先順序為止。

4.若當前運算子為「)」,則一直出棧,直到遇到(停止。(左括號出棧,但是不輸出到字尾表示式中)

5.若中綴式掃瞄結束後棧不為空,則將棧中元素依次出棧並輸出到字尾式中。

根據字尾式求值

根據上述規則得到的字尾式是:954-+6-7+。根據字尾式求值的規則是,從左到右掃瞄字尾式,若為數字,則入棧,若為運算子,則從棧中彈出兩個運算元,先彈出的作為右運算元,後彈出的為左運算元,根據當前運算子運算之後將值入棧。

轉為字首表示式的規則

右到左掃瞄中綴表示式,

若遇到數字,則將其輸出。

若遇到運算子,

1.若為「)」則將其入棧。

2.若此時棧為空或者棧頂為")",則將其入棧。

3.當前運算子優先順序大於等於棧頂運算子優先順序,則將其入棧,反之(也就是小於),則一直將棧頂運算子出棧,直到當前運算子優先順序大於等於棧頂運算子優先順序為止。

4.若當前運算子為「(」,則一直出棧,直到遇到)停止。(右括號出棧,但是不輸出到字首表示式中)

5.若中綴表示式掃瞄結束後,棧不為空,則將棧中元素依次彈出,輸出到字首式中。

6.最後將其逆置就是最終的字首式。

根據字首式求值

根據上述規則得到的字首式是:+ -+9-5467。根據字首式求值的規則是,從右到左掃瞄字首式,若為數字,則入棧,若為運算子,則從棧中彈出兩個運算元,先彈出的作為左運算元,後彈出的為右運算元,根據當前運算子運算之後將值入棧。

#include 

#include

#include

using namespace std;

stack<

int>

s;//954-+6-7+

intmain()

} cout << s.

top(

)<< endl;

}return0;

}

字尾表示式求值

字尾表示式求值過程中不需要考慮運算子的優先順序,只需要對該表示式中的每乙個元素進行判斷,若為運算元則將其儲存在乙個陣列裡 入棧 若為運算子則取出前面的兩個運算元 彈棧 並運算,並將運算結果放回該陣列 入棧 最終陣列的最後乙個元素 棧頂元素 即為該表示式的運算結果.如 字尾表示式 23 等價於中綴表示...

字尾表示式求值

題目描述 為了便於處理表示式,常常將普通表示式 稱為中綴表示 轉換為字尾sqstack 順序棧的初始化 status initstack sqstack s 順序棧的入棧 status push sqstack s,selemtype e 演算法3.3 順序棧的出棧 status pop sqsta...

字尾表示式求值

根據 逆波蘭表示法,求表示式的值。有效的算符包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。說明 整數除法只保留整數部分。給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 0 的情況。示例 1 輸入 tokens 2 1 3 輸出 9 解釋 該算式轉化為常見的中綴...