js實現逆波蘭式

2021-08-20 21:10:50 字數 1558 閱讀 1622

我們在寫算數表示式時,常用的表示式為中綴表示式形如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的操作,得到...

波蘭式和逆波蘭式

字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前.中綴和字尾同理 雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計...