逆波兰计算器(Java实现)
作者:dreamer_it 发布时间:2021-10-18 09:45:01
之前的一篇博客中,讲的是用栈实现了中缀表达式的简易计算器,对于我们人来讲,中缀表达式是一种比较直观,而且非常好计算的一种形式,但对于计算器来讲,非常的难去看懂。所以,下面我讲下逆波兰计算器的Java实现。
逆波兰式(后缀表达式)
逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法 [1] 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。
-------摘自百度
逆波兰式的转换方法
我主要讲解下前缀表达式如何转换成后缀表达式。举例:4*5-8+60+8/2
根据该表达式可以画出对应的二叉树,然后根据后序遍历(从下往上,从左到右再到根),遍历的结果是4 5 * 8 - 60 + 8 2 / +
所以得到的逆波兰表达式就是4 5 * 8 - 60 + 8 2 / +
分析:
前面的中缀表达式的实现,使用了两个栈,一个是数栈,一个是符号栈。在后缀表达式中,只需要使用一个栈就可以完成简易的计算。遍历表达式,如果出现数字,则直接将数字压入栈中。如果出现的是符号就直接将栈中弹出两个数进行计算,再将计算得到的值放入栈中,一直循环计算,最终放入栈中的值就是表达式的计算结果。
代码实现
package cn.mrlij.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 逆波兰表达式计算器实现
*/
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);
//计算值,得结果
int res = calc(list);
System.out.println(res);
}
/**
* 遍历表达式,并将遍历的结果放入list中
* @param exp 表达式
* @return
*/
public static List<String> getStrList(String exp){
String arr[] = exp.split(" ");//将字符串遍历得到数组
List<String> list = new ArrayList<>();
for(String str : arr){
list.add(str);
}
return list;
}
//计算表达式
public static int calc(List<String> list ){
//创建存放字符串的栈
Stack<String> stack = new Stack<>();
//遍历list
for (int i = 0;i<list.size();i++){
//正则表达式匹配是否是数字
if(list.get(i).matches("\\d+")){
stack.push(list.get(i));//是数字则放入栈中
}else {
int num2 = Integer.parseInt(stack.pop());//弹出数字1
int num1 = Integer.parseInt(stack.pop());//弹出数字2
int res = 0;
//进行运算
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);
}
}
//留在栈中的值就是最后的计算表达式结果
return Integer.parseInt(stack.pop());
}
}
来源:https://blog.csdn.net/u013571044/article/details/101275033


猜你喜欢
- 本文实例讲述了C#调用SQLite的方法。分享给大家供大家参考。具体分析如下:一、SQLite简介:当我们用到海量数据时一般会用Oracle
- 1. Spring框架的注解式开发# Spring框架的注解式(Annotation)开发1. 注解式开发定义:通过Spring框架提供的一
- 在项目中使用Maven管理jar包依赖,往往会出现以下状况:1、国内访问maven默认远程中央镜像特别慢;2、使用阿里的镜像替代远程中央镜像
- 本文实例讲述了Java实现的不同图片居中剪裁生成同一尺寸缩略图功能。分享给大家供大家参考,具体如下:因为业务需要,写了这样一个简单类,希望能
- #region 提示信息#endregion作用:折叠并隐藏代码 ,别且折叠以后能够显示白字“提示信息”如下图就是使用了#region和#e
- C#实现的Check Password,并根据输错密码的次数分情况锁定账户:如果输入错误3次,登录账户锁定5分钟并提示X点X分后重试登录。如
- Linux Hadoop 2.7.3 安装搭建Hadoop实现了一个分布式文件系统(Hadoop Distributed File Syst
- 一、概述我们知道,当我们对es发起search请求或其他操作时,往往都是随机选择一个coordinator发起请求。而这请求,可能是该节点能
- 在使用Gateway 调用一个文件上传服务时 前端传来的File的base64字符串怎么都接受不到 但是用Body方式请求就能接收到后来经过
- 任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的th
- 先吐槽一下,现在的Bean Searcher操作手册的指引弱的可怜…对我这样的小白及其不友好话不多说直入主题1、首先肯
- 总体实现思路是启动一个生产者项目注册, 将所含服务注册到zookeeper的注册中心, 然后在启动一个消费者项目,将所需服务向zookeep
- 环境说明:Android Studio 2.0V7包版本:com.android.support:appcompat-v7:23.4.0co
- future机制是在通过线程去执行某个任务的时候,如果比较耗时,我们可以通过futureTask机制,异步返回,继续去执行其他的任务,在需要
- 1. 前言不知道小伙伴对于日期字段,在项目中都是如何处理的,是单独给每个字段都自定义日期格式还是做全局格式设置?这个我之前啊,是
- 一.协程间的通信当需要进行协程间的通信时,可以调用Channel方法,创建一个Channel接口指向的对象,通过调用该对象的send方法和r
- merge标签合并标记需要两个或两个以上的列表作为参数,并把它们合并在一起,如下所示:<s:merge var="myMer
- 这篇文章主要介绍了springboot乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 实现GridView的横向滚动效果如下图:具体实现的代码•1. 主界面布局代码:activity_main.xml<?xml vers
- 前言InterruptedException异常可能没你想的那么简单!当我们在调用Java对象的wait()方法或者线程的sleep()方法