後綴表達式也叫逆波蘭表達式,其求值過程能夠用到棧來輔助存儲。假定待求值的後綴表達式爲:6 5 2 3 + 8 * + 3 + *,則其求值過程以下:spa
1)遍歷表達式,遇到的數字首先放入棧中,此時棧以下所示:code
2)接着讀到「+」,則彈出3和2,執行3+2,計算結果等於5,並將5壓入到棧中。blog
3)讀到8,將其直接放入棧中。three
4)讀到「*」,彈出8和5,執行8*5,並將結果40壓入棧中。然後過程相似,讀到「+」,將40和5彈出,將40+5的結果45壓入棧...以此類推。最後求的值288。get
中綴表達式a + b*c + (d * e + f) * g,其轉換成後綴表達式則爲a b c * + d e * f + g * +。input
轉換過程須要用到棧,具體過程以下:it
1)若是遇到操做數,咱們就直接將其輸出。io
2)若是遇到操做符,則咱們將其放入到棧中,遇到左括號時咱們也將其放入棧中。console
3)若是遇到一個右括號,則將棧元素彈出,將彈出的操做符輸出直到遇到左括號爲止。注意,左括號只彈出並不輸出。function
4)若是遇到任何其餘的操做符,如(「+」, 「*」,「(」)等,從棧中彈出元素直到遇到發現更低優先級的元素(或者棧爲空)爲止。彈出完這些元素後,纔將遇到的操做符壓入到棧中。有一點須要注意,只有在遇到" ) "的狀況下咱們才彈出" ( ",其餘狀況咱們都不會彈出" ( "。
5)若是咱們讀到了輸入的末尾,則將棧中全部元素依次彈出。
規則不少,仍是用實例比較容易說清楚整個過程。以上面的轉換爲例,輸入爲a + b * c + (d * e + f)*g,處理過程以下:
1)首先讀到a,直接輸出。
2)讀到「+」,將其放入到棧中。
3)讀到b,直接輸出。
此時棧和輸出的狀況以下:
4)讀到「*」,由於棧頂元素"+"優先級比" * " 低,因此將" * "直接壓入棧中。
5)讀到c,直接輸出。
此時棧和輸出狀況以下:
6)讀到" + ",由於棧頂元素" * "的優先級比它高,因此彈出" * "並輸出, 同理,棧中下一個元素" + "優先級與讀到的操做符" + "同樣,因此也要彈出並輸出。而後再將讀到的" + "壓入棧中。
此時棧和輸出狀況以下:
7)下一個讀到的爲"(",它優先級最高,因此直接放入到棧中。
8)讀到d,將其直接輸出。
此時棧和輸出狀況以下:
9)讀到" * ",因爲只有遇到" ) "的時候左括號"("纔會彈出,因此" * "直接壓入棧中。
10)讀到e,直接輸出。
此時棧和輸出狀況以下:
11)讀到" + ",彈出" * "並輸出,而後將"+"壓入棧中。
12)讀到f,直接輸出。
此時棧和輸出狀況:
13)接下來讀到「)」,則直接將棧中元素彈出並輸出直到遇到"("爲止。這裏右括號前只有一個操做符"+"被彈出並輸出。
14)讀到" * ",壓入棧中。讀到g,直接輸出。
15)此時輸入數據已經讀到末尾,棧中還有兩個操做符「*」和" + ",直接彈出並輸出。
至此整個轉換過程完成。程序實現代碼後續再補充了。
1)先按照運算符的優先級對中綴表達式加括號,變成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )
2)將運算符移到括號的後面,變成((a(bc)*)+(((de)*f)+g)*)+
3)去掉括號,獲得abc*+de*f+g*+
1 function isOperator(value){ 2 var operatorString = "+-*/()"; 3 return operatorString.indexOf(value) > -1 4 } 5 6 function getPrioraty(value){ 7 switch(value){ 8 case '+': 9 case '-': 10 return 1; 11 case '*': 12 case '/': 13 return 2; 14 default: 15 return 0; 16 } 17 } 18 19 function prioraty(o1, o2){ 20 return getPrioraty(o1) <= getPrioraty(o2); 21 } 22 23 function dal2Rpn(exp){ 24 var inputStack = []; 25 var outputStack = []; 26 var outputQueue = []; 27 28 for(var i = 0, len = exp.length; i < len; i++){ 29 var cur = exp[i]; 30 if(cur != ' ' ){ 31 inputStack.push(cur); 32 } 33 } 34 console.log('step one'); 35 while(inputStack.length > 0){ 36 var cur = inputStack.shift(); 37 if(isOperator(cur)){ 38 if(cur == '('){ 39 outputStack.push(cur); 40 }else if(cur == ')'){ 41 var po = outputStack.pop(); 42 while(po != '(' && outputStack.length > 0){ 43 outputQueue.push(po); 44 po = outputStack.pop(); 45 } 46 if(po != '('){ 47 throw "error: unmatched ()"; 48 } 49 }else{ 50 while(prioraty(cur, outputStack[outputStack.length - 1]) && outputStack.length > 0){ 51 outputQueue.push(outputStack.pop()); 52 } 53 outputStack.push(cur); 54 } 55 }else{ 56 outputQueue.push(new Number(cur)); 57 } 58 } 59 console.log('step two'); 60 if(outputStack.length > 0){ 61 if(outputStack[outputStack.length - 1] == ')' || outputStack[outputStack.length - 1] == '('){ 62 throw "error: unmatched ()"; 63 } 64 while(outputStack.length > 0){ 65 outputQueue.push(outputStack.pop()); 66 } 67 } 68 console.log('step three'); 69 return outputQueue; 70 71 }