我們在寫算數表示式時,常用的表示式為中綴表示式形如a+(b-c/d)*e;而將中綴表示式轉化為字尾表示式則是為了更方便機器進行運算, 字尾表示式形如abcd/-e*+
中綴轉字尾的大體思路為:
首先我們要建立兩個陣列物件; 乙個用於儲存符號表示式,另乙個則用來記錄字尾表示式元素。另外這兩個陣列採用push, pop的方式模擬棧的行為。
對於符號的操作行為:
如果遇到左括號則直接入棧
如果遇到右括號,則彈出站內只到出現左括號為止
如果站外操作符的優先順序高於站內的優先順序則入棧
如果棧外的操作符優先順序低於或等於棧內的優先順序,輸出棧內的符號,併入棧棧外的符號
中綴表示式遍歷完成,但是棧中還有符號存在,一一出棧輸出
var symbol = ['#', '(', '+', '-', '*', '/', ')']
var symbolpriority =
// 如果遇到左括號則直接入棧
// 如果遇到右括號,則彈出站內只到出現左括號為止
// 如果站外操作符的優先順序高於站內的優先順序則入棧
// 如果棧外的操作符優先順序低於或等於棧內的優先順序,輸出棧內的符號,併入棧棧外的符號
// 中綴表示式遍歷完成,但是棧中還有符號存在,一一出棧輸出
function operasymbol (char, symarr, resarr)
if (char === '(') else if (char === ')')
} else if (symbolpriority[char] > symbolpriority[lastchar]) else if (symbolpriority[char] <= symbolpriority[lastchar])
// operasymbol(char, symarr, resarr)
symarr.push(char)
} else
}function tosuffixexpre (str) else
} resarr.push(substr)
while (symarr.length > 0)
var result = resarr.join(' ')
return result
}var test1 = '1+(2-3)*4+10/5'
console.log('the success is 1 2 3 - 4 * + 10 5 / +')
var result1 = tosuffixexpre(test1)
console.log(result1)
var test2 = 'a+(b-c/d)*e'
console.log('the success is abcd/-e*+')
var result2 = tosuffixexpre(test2)
console.log(result2)
var test3 = '9+3+6*9-7'
var result3 = tosuffixexpre(test3)
console.log(result3)
逆波蘭式 棧實現
因為做二叉樹非遞迴的前後中遍歷,用到棧的方法。xpp說那就乾脆把四則運算,逆波蘭式 棧的實現做了。這是參考別人的程式寫的,注釋比較亂。而且這個是直接實現計算機計算的四則運算,沒有將逆波蘭的表示式列印出來。今天腰太酸了,明天改一改,把逆波蘭式列印出來噻333333.棧還有迷宮演算法是不是?現在腦子裡之...
C 實現逆波蘭式
a b c的逆波蘭式為ab c,假設計算機把ab c按從左到右的順序壓入棧中,並且按照遇到運算子就把棧頂兩個元素出棧,執行運算,得到的結果再入棧的原則來進行處理,那麼ab c的執行結果如下nkqnqmthw 1 a入棧 0位置 2 b入棧 1位置 3 遇到運算子 將a和b出棧,執行a b的操作,得到...
波蘭式和逆波蘭式
字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前.中綴和字尾同理 雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計...