完整的逆波蘭計算器實現

2021-10-08 14:04:49 字數 2375 閱讀 5117

逆波蘭bai表示式 rpn(reverse polish notation)

逆波蘭du表示式,它的zhi語法規定,表示式必須以逆dao波蘭表示式的方式給出。逆波蘭表示式又叫做字尾表示式。這個知識點在資料結構和編譯原理這兩門課程中都有介紹,下面是一些例子:

​ 利用棧實現逆波蘭計算器,主要的是我們人們計算的表示式一般都是中綴表示式比如:2+3;(2*3)+2等等,雖然我們人們看的一目了然但是利用棧的特性來做計算的時候常常非常麻煩,這時候就出現了個逆波蘭表示式也稱為字尾表示式比如:(2+3)/4的字尾表示式是 2 3 + 4/這個表示式在經過stack的運算的時候會非常的方便。現在來介紹如何從中綴表示式轉為字尾表示式;

中綴表示式轉字尾表示式的思想:

​ 1、初始化兩個棧 s1,s2

​ 2、從左到右掃瞄中綴表示式

​ 3、遇到數字的時候直接壓入棧s2

​ 4、遇到操作符的時候有幾種情況:

​ 1、遇到棧為空,或許s1棧頂的元素是「(」左括號直接入棧

​ 2、當前掃瞄的元素比棧頂的優先順序還高直接入棧

​ 3、如果遇到右括號的時候 依次取出s1的棧頂元素壓入s2中直到遇到s1棧頂元素是"("左括號,這時

​ 把括號丟棄

​ 4、假如當前操作符不比棧頂的優先順序大的時候,取出s1的棧頂操作符壓入s2然後重複2、3、4步驟

​ 直到入棧

​ 5、掃瞄完成後依次取出s1的棧頂元素壓入s2中

​ 6、逆序輸出s2棧此時結果就是字尾表示式;

根據這個思想我們用**來實現

public

static list

toinfixconversuffixpression

(list

lists)

else

else

else

if(str.

equals

(")"))

}elseif(

priorityoper

(str.

charat(0

))>

priorityoper

(s1.

peek()

.charat(0

)))else

s2.push

(s1.

pop())

;}}}

}}//掃瞄完成後把s1剩餘的元素依次取出壓入s2

while

(!s1.

isempty()

)//將s2遍歷add到list中

list

suffixpression =

newarraylist

<

>()

;while

(!s2.

isempty()

)//list翻轉的方法

collections.

reverse

(suffixpression)

;return suffixpression;

}

上面我們就完成了中綴轉字尾表示式的演算法

然後我們看下逆波蘭計算器的思想:

逆波蘭計算器的思想:

​ 1、遍歷字尾表示式

​ 2、遇到數字直接壓入乙個stack

​ 3、遇到操作符取出stack的頂元素和此頂元素計算完成後再壓入stack中

根據逆波蘭計算器的思想我們來實現**

public

static

intcalcuate

(list

lists)

else

else

if(item.

equals

("-"))

else

if(item.

equals

("*"))

else

if(item.

equals

("/"))

else

stack.

push

(res +"")

;}}return integer.

parseint

(stack.

pop())

;}

測試

public

static

void

main

(string[

] args)

執行結果

最後的結果是175

逆波蘭計算器

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.逆波蘭表示式邏輯實現 如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後...

逆波蘭計算器

遍歷表示式。碰到數字將其放到棧中。遇到計算符 從棧中彈出兩個數用計算然後再從新入棧。a 在棧中的最後乙個數即為結果 轉換前 2 9 6 3 5 4轉換後 2963 5 4 使用逆波蘭計算結果為 16.0public class rpncalculator 如果是不是計算符,直接入棧 stack.pu...