專題19 中綴轉化成字尾C語言(四)

2021-10-07 02:46:38 字數 1630 閱讀 6014

複習到到佇列和棧時涉及到了不太清楚的「中綴轉化成字尾」的過程,專題中有寫,就記錄下來

參考:按運算子優先順序對所有運算子和它的運算數加括號,(原本的括號不用加)

把運算子移到對應的括號後

去掉括號

具體例如:

a/b+(c∗d-e∗f)/g

加括號後式子變成:

((a/b)+(((c∗d)-(e∗f))/g))

把運算子移動到對應括號後面,再去掉括號:

ab/cd∗ef∗-g/+

參考資料中的步驟

從左到右讀進中序表示式的每個字元。

如果讀到的字元為運算元,則直接輸出到字尾表示式的陣列。

如果遇到「( 」,也將其放入棧中。

如果遇到「 )」,則將棧頂元素彈出,將彈出的運算元輸出到字尾陣列中,直到遇到左括號為止,注意,左括號只彈出並不輸出到字尾表示式中。

如果遇到操作符,當棧為空時,直接入棧,棧不空時,判斷棧頂元素操作符優先順序是否比當前操作符小,小的話直接把當前操作符進棧,不小的話棧頂元素輸出到字尾陣列中,直到棧頂元素操作符優先順序比當前操作符小,再入棧。

如果我們讀到了輸入的末尾,則將棧中所有元素依次彈出輸出到字尾表示式中

查閱網路發現有更方便記憶的演算法

來自:從左向右順序獲取中綴表示式,數字直接輸出

遇到左括號直接入棧遇到右括號將棧中左括號之**棧的運算子全部出棧輸出,注意,左括號出棧但是不輸出。

遇到加號和減號,如果此時棧空,則直接入棧,將棧中優先順序不小於的運算子依次出棧(注意:加號和減號屬於同乙個優先順序,所以也依次彈棧)直到棧空或則遇到左括號為止,停止出棧。

遇到乘號和除號直接入棧,直到遇到優先順序比它更低的運算子,依次出棧。

獲取完後,將棧中剩餘的運算符號依次出棧輸出

/*中綴轉字尾函式*/

void

change

(stack *s,elemtype str)

}if(str[i]

=='+'

||str[i]

=='-'

)else

else

}while(!

stackempty

(s)&& e !=

'(')

;//否則出棧,直到棧空或遇到左括號

push

(s,str[i]);

}}/*當遇到右括號是,把括號裡剩餘的運算子彈出,直到匹配到左括號為止

左括號只彈出不列印(右括號也不壓棧)*/

else

if(str[i]

==')')}

/*乘、除、左括號都是優先順序高的,直接壓棧*/

else

if(str[i]

=='*'

||str[i]

=='/'

||str[i]

=='('

)else

if(str[i]

=='\0'

)else

i++;}

/*最後把棧中剩餘的運算子依次彈棧列印*/

while(!

stackempty

(s))

}

將中綴表示式轉化成字尾表示式

中綴變字尾主要的思想就是將需要的運算子先做乙個對映 對於任意表示式,式中從頭開始掃,遇到非運算子,即任意數字或字母直接輸出 遇到運算子考慮放入棧中 若棧空則放入 若棧不為空,判斷棧頂的優先順序是否 待放入的運算子,若 小於則將其壓入棧中 若不小於,則將棧一直 pop,知道運算子可以放入棧中 當然還有...

資料結構中的中綴表示式轉化成字尾表示式

已知操作符包括 形如中綴表示式 a b a c d e f g 步驟掃瞄項 項型別動作 棧內內容輸出0 入棧,讀入下乙個符號 1 a運算元 直接輸出 a 2 操作符isp icp 進棧 3 b運算元 直接輸出 b 4 操作符isp icp 退棧並退出 5isp icp 進棧 6 a運算元 直接輸出 ...

c 中如何把int轉化成char

在 c 裡把其它 型別轉換 成字串時最好是用純 c 的機制 stringstream 類。include include using namespace std void main stringstream 的 str 方法返回 string string 的 c str 方法則返回 c 字串。應當...