逆波蘭計(jì)算器(Java實(shí)現(xiàn))
之前的一篇博客中,講的是用棧實(shí)現(xiàn)了中綴表達(dá)式的簡易計(jì)算器,對于我們?nèi)藖碇v,中綴表達(dá)式是一種比較直觀,而且非常好計(jì)算的一種形式,但對于計(jì)算器來講,非常的難去看懂。所以,下面我講下逆波蘭計(jì)算器的Java實(shí)現(xiàn)。
逆波蘭式(后綴表達(dá)式)
逆波蘭表達(dá)式又叫做后綴表達(dá)式。逆波蘭表示法是波蘭邏輯學(xué)家J・盧卡西維茲(J・ Lukasewicz)于1929年首先提出的一種表達(dá)式的表示方法 [1] 。后來,人們就把用這種表示法寫出的表達(dá)式稱作“逆波蘭表達(dá)式”。逆波蘭表達(dá)式把運(yùn)算量寫在前面,把算符寫在后面。
-------摘自百度
逆波蘭式的轉(zhuǎn)換方法
我主要講解下前綴表達(dá)式如何轉(zhuǎn)換成后綴表達(dá)式。舉例:4*5-8+60+8/2

根據(jù)該表達(dá)式可以畫出對應(yīng)的二叉樹,然后根據(jù)后序遍歷(從下往上,從左到右再到根),遍歷的結(jié)果是4 5 * 8 - 60 + 8 2 / +
所以得到的逆波蘭表達(dá)式就是4 5 * 8 - 60 + 8 2 / +
分析:
前面的中綴表達(dá)式的實(shí)現(xiàn),使用了兩個(gè)棧,一個(gè)是數(shù)棧,一個(gè)是符號棧。在后綴表達(dá)式中,只需要使用一個(gè)棧就可以完成簡易的計(jì)算。遍歷表達(dá)式,如果出現(xiàn)數(shù)字,則直接將數(shù)字壓入棧中。如果出現(xiàn)的是符號就直接將棧中彈出兩個(gè)數(shù)進(jìn)行計(jì)算,再將計(jì)算得到的值放入棧中,一直循環(huán)計(jì)算,最終放入棧中的值就是表達(dá)式的計(jì)算結(jié)果。
代碼實(shí)現(xiàn)
package cn.mrlij.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 逆波蘭表達(dá)式計(jì)算器實(shí)現(xiàn)
*/
public class PolandNotation {
public static void main(String[] args) {
//4*5-8+60+8/2
String expression = "4 5 * 8 - 60 + 8 2 / +";
List<String> list = getStrList(expression);
System.out.println(list);
//計(jì)算值,得結(jié)果
int res = calc(list);
System.out.println(res);
}
/**
* 遍歷表達(dá)式,并將遍歷的結(jié)果放入list中
* @param exp 表達(dá)式
* @return
*/
public static List<String> getStrList(String exp){
String arr[] = exp.split(" ");//將字符串遍歷得到數(shù)組
List<String> list = new ArrayList<>();
for(String str : arr){
list.add(str);
}
return list;
}
//計(jì)算表達(dá)式
public static int calc(List<String> list ){
//創(chuàng)建存放字符串的棧
Stack<String> stack = new Stack<>();
//遍歷list
for (int i = 0;i<list.size();i++){
//正則表達(dá)式匹配是否是數(shù)字
if(list.get(i).matches("\\d+")){
stack.push(list.get(i));//是數(shù)字則放入棧中
}else {
int num2 = Integer.parseInt(stack.pop());//彈出數(shù)字1
int num1 = Integer.parseInt(stack.pop());//彈出數(shù)字2
int res = 0;
//進(jìn)行運(yùn)算
if(list.get(i).equals("+")){
res = num1 + num2;
}else if(list.get(i).equals("-")){
res = num1 - num2;
}else if(list.get(i).equals("*")){
res = num1 * num2;
}else if(list.get(i).equals("/")){
res = num1/num2;
}else {
throw new RuntimeException("不是操作符號!");
}
stack.push(""+res);
}
}
//留在棧中的值就是最后的計(jì)算表達(dá)式結(jié)果
return Integer.parseInt(stack.pop());
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Spring中實(shí)現(xiàn)異步處理的步驟和代碼演示
在Spring中實(shí)現(xiàn)異步處理通常涉及到@Async注解,通過步驟和代碼演示,可以在Spring應(yīng)用程序中實(shí)現(xiàn)異步處理,記住要根據(jù)你的應(yīng)用程序的實(shí)際需求來調(diào)整線程池和異步方法的設(shè)計(jì),感興趣的朋友跟隨小編一起看看吧2024-06-06
SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解
這篇文章主要介紹了SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
關(guān)于報(bào)錯IDEA Terminated with exit code
如果在IDEA構(gòu)建項(xiàng)目時(shí)遇到下面這樣的報(bào)錯IDEA Terminated with exit code 1,那必然是Maven的設(shè)置參數(shù)重置了,導(dǎo)致下載錯誤引起的,本文給大家分享兩種解決方法,需要的朋友可以參考下2022-08-08
Springboot接收Get參數(shù)實(shí)踐過程
本文主要介紹了在Spring Boot中如何接收不同類型的請求參數(shù),包括在路徑中直接傳遞參數(shù)、跟在問號后面?zhèn)鬟f參數(shù)、使用Map接收參數(shù)、接收數(shù)組以及使用對象接收參數(shù)等方法2024-12-12
一文了解Java動態(tài)代理的原理及實(shí)現(xiàn)
動態(tài)代理指的是,代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對象的方法,是在程序運(yùn)行時(shí)根據(jù)需要動態(tài)的創(chuàng)建目標(biāo)類的代理對象。本文將通過案例詳細(xì)講解一下Java動態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下2022-07-07
JavaSE實(shí)現(xiàn)圖書管理系統(tǒng)的示例代碼
這篇博客是在學(xué)習(xí)了一部分Java基礎(chǔ)語法之后的練習(xí)項(xiàng)目,通過這個(gè)小項(xiàng)目的練習(xí),對Java中的類和對象,抽象類和接口等進(jìn)行熟悉理解??旄S小編一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

