2013北理上機 中綴轉字尾

2021-08-18 06:08:51 字數 2087 閱讀 1781

改了很長時間,到處出錯,很難過

1.注意每次輸入都要進行inf.clear();

2.解決了迭代器遍歷型別不匹配的warning:

for(vector::size_type i=0; i3.最重要的還是把思路搞明白,注意各種細節,邊界條件,以及如果利用比較優先順序彈棧,可以將'('設定為優先順序最低,這樣任何操作符和'('比較時,直接進行壓棧。

4.另外剛發現可以寫成:

postf.push_back(op_st.top());

op_st.pop();

不改了,懶

5.演算法思想:

首先我們在進行字尾表示式轉換為字尾表示式的過程中,利用了一種常見的資料結構:棧。我們利用棧先進後出的特性進行轉換操作。該棧用於儲存表示式中的操作符:

+、-、*、/、(、)

所以,我們將該棧稱作為操作符棧。

借助於棧這種資料結構,我們的演算法邏輯為:

1.順序掃瞄整個中綴表示式;

2.中綴表示式的元素型別分為兩類:運算元和操作符,如果當前元素為運算元,則將該元素直接存入到字尾表示式中;

3.如果當前元素為操作符,分為以下幾種情況進行討論:

3.1 如果為「(」,則將其直接入棧;

3.2 如果為「)」,則將棧中的操作符彈棧,並將彈棧的操作符存入到字尾表示式中,直至遇到「(」,將「(」從棧中彈出,並不將其存入到字尾表示式中(字尾表示式是不需要「(」和「)」的);

3.3 如果是其他操作符(+、-、*、/),如果其優先順序高於棧頂操作符的優先順序,則將其入棧,如果是小於或低於站定操作符優先順序,則依次彈出棧頂操作符並存入字尾表示式中,直至遇到乙個站定優先順序小於當前元素優先順序時為止,保持當前棧頂元素不變,並將當前元素入棧;

4.掃瞄完畢整個中綴表示式後,檢測操作符棧,依次彈出其元素,並將其元素順序存入到字尾表示式中。

相關討論

在進行中綴表示式轉換為字尾表示式過程中,除了中綴表示式、字尾表示式外,還涉及了中間結果即:操作符棧。利用操作符棧儲存在轉換過程中涉及優先順序先後順序的操作符。操作符的優先順序是根據 +、- 小於 *、/,運算順序是先左後右,括號操作最優先的規則進行的。

中綴表示式轉換為字尾表示式關鍵點主要有以下幾點:

1.使用操作符棧

2.對於運算元直接進入字尾表示式

3.對於「(」,入棧

4.對於「)」,彈棧,直至「(」

5.對於其他操作符,彈棧並進入字尾表示式,直至小於當前操作符優先順序或者「(」

6.掃瞄中綴表示式後,彈出棧中所有操作符並進入字尾表示式

#include #include #include #include #include #include #include using namespace std;

/* 中綴表示式轉字尾表示式

示例:輸入:a+b*(c-d)-e/f

輸出:abcd-*+ef/-

*/void getinf(vector& inf)

bool isoprator(const char c)

void printpostf(vector& postf)

cout << endl;

return;

}void inftopostf(vector& inf, vector& postf, mapop)else

else

else if(tmp == ')')

op_stack.pop(); //彈出左括號

中綴轉字尾

include using namespace std define max 30 struct stack void initstack stack s char pop stack s void push stack s,char c char top stack s int copare ch...

中綴轉字尾

棧的特性 後進先出 last in first out 資料結構 中綴 9.11 3 1 5 分離數字與運算子 9.11 3 1 5 字尾 9.11 3 1 5 中綴轉字尾過程 當前元素為數字,輸出,作為字尾表示式的一部分 如果當前運算子,比棧頂運算子優先順序低 小於等於 時,將棧頂元素輸出,作為字...

中綴轉字尾(棧)

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...