棧的應用 中綴與字尾表示式

2021-09-09 07:51:10 字數 1260 閱讀 8322

演算法流程 :中綴轉字尾

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

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

3.如果當前操作的事操作符,那麼要分幾種情況

3.1 如果當前的運算子是(「(」)則直接將其入棧。

3.2如果是(「)」),則將棧中的操作符出棧,直到遇到「)」 (這裡需要強調的是括號是不需要進入字尾表示式的)

3.3 如果是其他的運算子(+、-、*、/)如果這個運算度的優先順序高於棧頂元素的優先順序,那麼將這個元素入棧,

如果小於或者等於棧頂運算子的優先順序,則將棧頂元素依次彈出,直到該操作符的優先順序大於棧頂操作符的優先順序

或者為「(」為止,保持當前棧頂的操作符不變,並將當前操作符入棧

4 掃瞄整個中綴表示式後,檢測操作符棧,依次彈出其中的操作符,並按序存入到字尾表示式中。

#include#include#include#include#include#include#define max_size 100;

using namespace std;

//中綴轉字尾 :

//(1)初始化每個運算子的優先順序

void init_op(map&ops)

//(2)檢視表示式中的元素是不是操作符

bool is_opertor(const string &s, mapops)

//核心操作 中綴轉字尾

void is2operator(vector&info, vector& postf,map&ops)

else

if(!s.empty()&&s.top()== "(")

s.pop();//出棧「(」

}else

s.push(info[i]);

}} }

}while(!s.empty())

}//第二部分 字尾表示式的計算

int main()

else // 如果是操作符

else if (info[i] == "(") // 如果是左括號

else}}

else // 如果是其他操作符

// 將當前操作符入棧

s1.push(info[i]);

}} }

// 檢測操作符棧是否為空

while (!s1.empty())

// 將prefix翻轉

reverse(info.begin(), info.end());

}

棧的應用 中綴表示式轉字尾表示式

有關棧api詳情請參看我的另一篇博文 棧的鏈式儲存 api實現 例項 5 4 5 4 1 2 3 1 2 3 8 3 1 5 8 3 1 5 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...

棧的應用 (中綴表示式 轉 字尾表示式)

中綴表示式 字尾表示式,都是用來呈現運算表示式的一種方式。標準表示式 4 5 6 7 中綴表示式,就是標準的表示式,即4 5 6 7 字尾表示式,符號在後的表示式,即4 5 6 7 中綴表示式轉字尾表示式的思想是 注意的是 只有 這5種符號才會入棧 1.讀到運算元時,立即輸出 2.讀到的是操作符,分...

棧的應用 中綴表示式轉字尾表示式

中綴轉字尾過程 1.對於數字 直接輸出 2.對於符號 2.1 左括號 進棧 2.2 運算符號 與棧頂符號進行優先順序比較,若棧頂符號優先順序低 此符號進棧 若棧頂符號優先順序不低 將棧頂符號彈出並輸出,之後進棧 若是乘除直接進棧 若是加減,與棧頂比較,若棧頂是乘除,直接輸出,否則進棧。2.3 右括號...