今天在搜索PHP算法的時候,無心間進入了知乎,有人問,PHP須要算法?有人說須要,有人說不須要,這裏不說結論,只談看到的一個回覆,裏面提到了逆波蘭表達式,我搞PHP一年了仍是第一次聽到這個詞(原諒我不是計算機專業,算法知識也很弱,正在學習中),以爲很新鮮,因此想分享一下!web
逆波蘭表達式又稱後綴表達式,它的解釋器通常都是基於堆棧的,操做數入棧,遇到操做符時,操做數出棧,求值,將結果入棧;寫法是運算符在數字的後面,表達式中無需使用小括號"()",運算順序也清楚明瞭,如中綴表達式1 + 2用逆波蘭表達式則爲 1 2 +,中綴表達式1 + 2 * 3用逆波蘭表達式則爲 1 2 3 * +,PS:在搜索中綴表達式時,看到百度百科的詞條裏面好像有錯誤,理解了這個例子能更好的理解逆波蘭表達式,以下圖(截圖時間是2015-08-30 20:40):算法
它舉了一個例子:中綴表達式8 + 4 - 6 * 2(=0)用逆波蘭表達式則爲6 2 * 8 4 + -(=0),按照這個逆波蘭表達式,若是轉爲中綴表達式實際上是(6 * 2) - (8 + 4)(=0),計算結果沒有問題,但計算順序錯誤。若是把中綴表達式換爲8 + 4 - 6 * 3(= 負6),按照圖中寫法逆波蘭表達式則爲6 3 * 8 4 + -(= 正6),因此正確寫法應是8 4 + 6 2 * - 或是8 4 + 6 3 * -(若是有理解不對的地方,請快速提醒我,以避免誤導他人)。學習
逆波蘭表達式的優勢(摘自維基百科,自由的百科全書):
google
用於表達式求值,以利用堆棧結構和減小計算機內存訪問。url
當有操做符時就計算,所以,表達式並非從右至左總體計算而是每次由中心向外計算一部分,這樣在複雜運算中就不多致使操做符錯誤。spa
堆棧自動記錄中間結果,這就是爲何逆波蘭計算器能容易對任意複雜的表達式求值。與普通科學計算器不一樣,它對錶達式的複雜性沒有限制。ip
逆波蘭表達式中不須要括號,用戶只需按照表達式順序求值,讓堆棧自動記錄中間結果;一樣的,也不須要指定操做符的優先級。逆波蘭計算器中,沒有「等號」鍵用於開始計算。內存
逆波蘭計算器須要「確認」鍵用於區分兩個相鄰的操做數。get
機器狀態永遠是一個堆棧狀態,堆棧裏是須要運算的操做數,棧內不會有操做符。百度
教育意義上,逆波蘭計算器的使用者必須懂得要計算的表達式的含義。