複習到到佇列和棧時涉及到了不太清楚的「中綴轉化成字尾」的過程,專題中有寫,就記錄下來
參考:按運算子優先順序對所有運算子和它的運算數加括號,(原本的括號不用加)
把運算子移到對應的括號後
去掉括號
具體例如:
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 字串。應當...