首先回顧一下如何由中綴表示式轉為字首和字尾,以中綴表示式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 解釋 該算式轉化為常見的中綴...