棧的應用之逆波蘭計算器練習

2021-10-10 05:32:12 字數 2687 閱讀 8074

public

class

operation

return result;

}}

逆波蘭表示式,在逆波蘭記法中,所有操作符置於運算元的後面,所以逆波蘭表示又稱字尾表示式。逆波蘭記法不需要括號來標識操作符的優先順序。

將中綴表示式轉後字尾表示式需要用到兩個棧,乙個是符號棧,乙個是結果棧。

先將表示式轉成list型別(我這裡表示式寫的是string型別,轉成list好操作)

//將中綴表示式轉成list,拆分中綴表示式

public

static list

toinfixexpressionlist

(string s)

else

expression.

add(keepnum);}

}while

(i < s.

length()

);return expression;

}

然後就可以進行轉換了,舉例:

從左往右掃瞄中綴表示式,掃瞄到第乙個是"(",直接壓入符號棧

繼續掃瞄,掃瞄到數字,直接入結果棧

繼續掃瞄,掃瞄到"+",由於符號棧棧頂是"(",不需要比較運算子優先順序,直接將"+「壓入符號棧中

繼續掃瞄,遇到數字2,直接壓入棧中

繼續掃瞄,遇到」)",彈出符號棧中的運算子壓入結果棧中去,直到遇到"(",同時將此時符號棧棧頂的"(「彈出,一對括號就消除掉了

繼續掃瞄,掃瞄到」*",此時符號棧為空,可以直接壓入符號棧中

繼續掃瞄,數字直接壓入結果棧中

繼續掃瞄,遇到運算子"+",此時符號棧不為空,此時需要和符號棧棧頂的運算子進行優先順序的比較,如果此時運算子的優先順序大於符號棧棧頂運算子的優先順序可以直接將該運算子壓入符號棧,否則需要將符號棧棧頂的運算子壓入結果棧中,再次與符號棧棧頂的運算子進行比較,反覆上述操作,直到優先順序大於符號棧棧頂運算子的優先順序,就將該運算子壓入符號棧中。

繼續掃瞄,是數字,直接壓入結果棧

掃瞄結束,將符號棧中的運算子依次壓入結果棧中

將結果棧中的元素依次彈出,結果的逆序就是字尾表示式

public

static list

tosuffixexpreesionlist

(string infixexpression)

else

else

if(item.

equals

(")"))

s1.pop();

//消除"("一對括號被丟棄

}else

s1.push

(item)

;//最後將item壓入符號棧中}}

}//將符號棧中剩餘的運算子壓入最後的結果棧中

while

(!s1.

isempty()

)return s2;

}

計算器的實現只需要乙個站

依次掃瞄字尾表示式,數字直接壓入棧中,遇到運算子從棧中壓入兩個數進行運算,將結果再次壓入棧中,繼續掃瞄

public

static

intpolandnotationcalculator

(string expression)

else

else

if(item.

equals

("-"))

else

if(item.

equals

("/"))

else

if(item.

equals

("*"))

else

stack.

push(""

+ result);}

}return integer.

parseint

(stack.

pop())

;}

棧之逆波蘭計算器

逆波蘭表示式又叫做字尾。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。逆波蘭表示式,它的語法規定,表示式必須以逆波蘭表...

逆波蘭計算器

include include include define stack init size 20 初始化棧的空間 define stackincrement 10 擴充套件空間 define maxbuffer 10 最大緩衝區 typedef double elemtype 建立乙個棧 type...

逆波蘭計算器

1.逆波蘭表示式用途 逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如 a b c d 轉換為ab cd 2.逆波蘭表示式邏輯實現 如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後...