字尾表示法也叫逆波蘭表示法(字首就是波蘭表示法),由於所有的操作符都在運算元的後面,所以被稱為字尾表示法。
中綴表示法的操作符在運算元之間,也是最符合人的邏輯。字首表示法的操作符在運算元之前,它和字尾表示法一樣,都是為了方便計算機計算,因為在字尾或字首中沒有括號,也不存在優先順序處理的問題,直接利用棧進行計算。
示例:
中綴:5+(1+2)*4-3
字尾:512+4*+3-
中綴轉字尾可以從左向右掃瞄表示式,然後按照規則進行處理,
對於中綴表示式a+((b+c)*d-e
的轉換步驟:
(1). 首先初始化兩個棧:輸出棧rpn_和操作符棧rpn_stack
(2). 從左至右掃瞄表示式,遇到運算元則直接壓入輸出棧,在遇到a時,由於是運算元,將"a"壓入rpn_
(3). 繼續掃瞄,遇到操作符時,如果該操作符優先順序高於rpn_stack棧頂的操作符,則直接壓入rpn_stack,如果同級或低於棧頂操作符,則將棧中操作符依次彈出(同時壓入輸出棧)直到遇到比當前操作符優先順序低的(或者遇到了"("),然後壓入操作符。(注意,對於操作符"(",只有")"才能將其彈出,其他情況不彈出"(")。現在我們掃瞄到了"+",由於當前的操作符棧空,直接壓入。
(4). 然後讀取到"(",由於它的優先順序是最高的,只要遇到就直接壓入棧。
(5). 然後讀取到運算元"b",壓入輸出棧 rpn_。
(6). 繼續讀取到 "+" ,當前操作符棧的棧頂是"(",因為只有")"才能將其彈出,所以"+"入棧。
(7). 讀取的"c"壓入輸出棧。
(8). 讀取到了")",此時開始將操作符棧的操作符依次彈出(同時壓入輸出棧),直到遇到第乙個"(",將"("彈出。("("和")"都不能進入輸出棧)
(9). 然後讀取到" * ",當前操作符棧的棧頂是"+",優先順序低於" * ",所以直接壓入棧。
(10). 讀取的"d"壓入輸出棧
(11). 讀取到"-",當前棧頂是" * ",比"-"的優先順序高,所以" * "彈出(同時壓入輸出棧,下同),然後棧頂"+"的優先順序和"-"相同,也要彈出。此時操作符棧空,"-"壓入
(12). 讀取到了"e",壓入輸出棧,此時表示式讀取完畢,將操作符棧依次彈出並壓入輸出棧,完成了轉換,輸出為abc+d*+e-
。
以下是將中綴表示式轉化為字尾表示式的**:
// 比較操作符a和操作符b的優先順序
bool opaisbiggerthanopb(string opa, string opb)
// 中綴表示式轉字尾表示式
bool parseformula(string formula)
else
//操作符入棧
if (t_formula == ")")
rpn_stack.pop_back();
}else if (rpn_stack.empty())
rpn_stack.push_back(t_formula);
else if (t_formula == "(" || rpn_stack[rpn_stack.size() - 1] == "(")
rpn_stack.push_back(t_formula);
else if (opaisbiggerthanopb(t_formula, rpn_stack[rpn_stack.size() - 1]))
rpn_stack.push_back(t_formula);
else
rpn_stack.push_back(t_formula);
}} // end else
} // end for
// 處理最後的還留在暫存區的運算元和操作符
if (!sign_.empty())
rpn_.push_back(sign_);
if(!rpn_stack.empty())
// 輸出測試
string rpn;
for (int i = 0; i < rpn_.size(); ++i)
cout << rpn << endl;
return true;
}
例如:parseformula("5+((1+2)*4)-3");
輸出為:512+4*+3-
對於字尾表示式:5 1 2 + 4 * + 3 -
:
(1). 首先建立乙個棧 res 用來儲存中間值,從左到右讀取字尾表示式,遇到運算元直接入棧,遇到操作符則將棧頂的兩個算子彈出,完成計算後將計算結果壓入棧。
(2). 首先讀取了 5、1、2,將它們依次入棧,當前的棧:
res:棧底
5 1 2
棧頂
(3). 然後讀取到操作符"+",彈出2,然後彈出1,將1+2
的運算結果3壓入棧:
res:棧底
5 3
棧頂
(4). 然後讀取到的運算元"4"入棧,接著讀取到" * ",如同上面,將4彈出,將3彈出,計算3*4
然後將12壓入棧。
(5). 後面的操作和前面一樣。
(6). 結果:14
字尾表示式 中綴到字尾表示式
輸入空格跳出迴圈 while k getchar n 字尾表示式 此 僅限於0 9內的加減乘除 include include include define long 10 using namespace std typedef struct stack qstack void init qstac...
C 中綴表示式轉字尾表示式
一 中綴表示轉字尾表示的規則 1.遇到操作符時,如果該操作符優先順序高於op stack棧頂的操作符,則直接壓入op stack,如果同級或低於棧頂操作符,則將棧中操作符依次彈出 同時壓入輸出棧 直到遇到比當前操作符優先順序低的,或者遇到了 2.和 都不能進入輸出棧。3.對於操作符 只有 才能將其彈...
字尾表示式
字尾表示式的計算和中綴表示式轉字尾表示式 此處的運算用的是鍊錶的表示方法 以下為三個會涉及到的標頭檔案 error.h 字尾表示式 created by kyle.yang on 14 12 2.ifndef error h define error h include using namespac...