C 字尾表示式

2021-08-06 01:25:05 字數 3139 閱讀 6494

字尾表示法也叫逆波蘭表示法(字首就是波蘭表示法),由於所有的操作符都在運算元的後面,所以被稱為字尾表示法。

中綴表示法的操作符在運算元之間,也是最符合人的邏輯。字首表示法的操作符在運算元之前,它和字尾表示法一樣,都是為了方便計算機計算,因為在字尾或字首中沒有括號,也不存在優先順序處理的問題,直接利用棧進行計算。

示例:

中綴: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...