將中綴表示式轉換為字尾表示式:
(1) 初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;
(2) 從左至右掃瞄中綴表示式;
(3) 遇到運算元時,將其壓入s2;
(4) 遇到運算子時,比較其與s1棧頂運算子的優先順序:
(4-1) 如果s1為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧;
(4-2) 否則,若優先順序比棧頂運算子的高(只能是高,相等都不行),也將運算子壓入s1;
(4-3) 否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)與s1中新的棧頂運算子相比較;
(5) 遇到括號時:
(5-1) 如果是左括號「(」,則直接壓入s1;
(5-2) 如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄;
(6) 重複步驟(2)至(5),直到表示式的最右邊;
(7) 將s1中剩餘的運算子依次彈出並壓入s2;
(8) 依次彈出s2中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式**換為字首表示式時不用逆序)。
string fun(string &s)
st.push(*it);
}else
if (*it == '*' || *it == '/') //* /的優先順序只會比+ -的高,所以下面是*或者/都要出棧
st.push(*it);
}else
if (*it == '(') //括號單獨考慮 左括號直接入棧 右括號直接出棧致左括號
st.push(*it);
else
if (*it == ')')
st.pop();
}it++;
}while (!st.empty())
return res;
}int calc(string &s) //計算字尾表示式,遇到符號前倆數運算
++it;
}return st.top();
}int _tmain(int argc, _tchar* argv)
字首 中綴 字尾表示式及中綴轉字尾表示式
字首表示式 不含括號的算術表示式,而且是將運算子寫在前面,運算元寫在後面的表示式。求法 首先從右往左掃瞄表示式,從右邊第乙個字元判斷,如果當前字元是數字,則一直到字串的末尾再記錄下來 如果是運算子,則將右邊最近的兩個數字串做相應的運算,以此作為乙個新串並記錄下來。一直掃瞄到最左端停止。例子 a b ...
中綴表示式轉字尾表示式並計算字尾表示式的值
中綴表示式轉字尾表示式思路 首先給用到的每個操作符如 等按照他們原本的計算優先順序定義兩個代表優先順序的數值,如instackpri代表入棧之後的優先順序,outstackpri代表入棧之前的優先順序.然後掃瞄表示式,如果是數字,直接輸出,如果是 則將棧頂操作符依次出棧,直到遇到 如果是其他操作符,...
中綴表示式轉字尾表示式及字尾表示式的計算
這裡舉個栗子手動轉換叭 ps 以下紅色括號皆為新增後的效果!中綴表示式 5 20 1 3 14 按運算子優先順序對所有運算子和它的運算數加括號 原本的括號不用加 5 20 1 3 14 把運算子移到對應的括號後 此處注意括號的變化 5 20 1 3 14 去掉括號 字尾表示式 5 20 1 3 14...