逆波蘭bai表示式 rpn(reverse polish notation) 利用棧實現逆波蘭計算器,主要的是我們人們計算的表示式一般都是中綴表示式比如:2+3;(2*3)+2等等,雖然我們人們看的一目了然但是利用棧的特性來做計算的時候常常非常麻煩,這時候就出現了個逆波蘭表示式也稱為字尾表示式比如:(2+3)/4的字尾表示式是 2 3 + 4/這個表示式在經過stack的運算的時候會非常的方便。現在來介紹如何從中綴表示式轉為字尾表示式;逆波蘭du表示式,它的zhi語法規定,表示式必須以逆dao波蘭表示式的方式給出。逆波蘭表示式又叫做字尾表示式。這個知識點在資料結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
中綴表示式轉字尾表示式的思想:根據這個思想我們用**來實現 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...