当前位置: 首页 > news >正文

逆波兰表达式

目录

一、定义

二、算法步骤

三、代码实现


一、定义

      逆波兰表达式又叫做后缀表达式,是一种没有括号,并严格遵循“从左到右”运算的后缀式表达方法。

二、算法步骤

1、首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。

2、读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。

3、从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。

4、如果不是数字,该字符则是运算符,此时需比较优先关系。

具体做法是:将该字符与运算符栈顶的运算符的优先关系相比较。如果该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。若不是的话,则将栈顶的运算符从栈中弹出,直到栈项运算符的优先级低于当前运算符,将该字符入栈。

5、重复步骤1~2,直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。

三、代码实现

中缀转后缀

根据算术计算的优先级将要依次实现的步骤用括号括起来,然后将算术运算符移到最近的括号外。

然后把所有括号删除,根据从左到右的顺序放入栈中,遇到运算符就进行计算,先拿出目前的栈顶元素为num2,然后再拿出新的栈顶元素为num1,然后让num1(运算符)num2进行计算,将计算结果再放入栈内。


import java.util.Stack;private boolean isOperation(String s){ //判断是否为运算符if (s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){return true;}return false;}public class Test {public int evalRPN(String[] tokens){Stack<Integer>stack=new Stack<>();for (String x:tokens){if (!isOperation(x)){stack.push(Integer.parseInt(x));}else {int num2=stack.pop();int num1=stack.pop();switch (x){case "x":stack.push(num1+num2);break;case "-":stack.push(num1-num2);break;case "*":stack.push(num1*num2);break;case "/":stack.push(num1/num2);break;}}}return stack.pop();}}

最后栈内只有一个元素,这个元素就是这个运算表达式的结果。


相关文章:

  • three.js官方案例(animation / multiple)webgl_animation_multiple.html学习笔记
  • Redisson分布式锁原理解析
  • 深度解析:短剧市场的发展趋势
  • MFC实现子控件focus焦点上下移动父控件ListView和Gridview也跟着向上下移动
  • CogVLM2多模态开源大模型部署与使用
  • 聊聊二叉堆、红黑树、时间轮在定时任务中的应用
  • zookeeper节点启动的主要逻辑
  • 4. MySQL 约束
  • 东方博宜1317 - 正多边形每个内角的度数?
  • webpack学习
  • 掌握复选框(Checkbox)的奥秘:全选与反选功能实现
  • uniapp封装picker选择器组件,支持关键字查询
  • react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项目
  • Docker搭建ELKF日志分析系统
  • GPT-4o:免费且更快的模型
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译] 怎样写一个基础的编译器
  • 【Linux系统编程】快速查找errno错误码信息
  • Bootstrap JS插件Alert源码分析
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Git同步原始仓库到Fork仓库中
  • Laravel 实践之路: 数据库迁移与数据填充
  • oldjun 检测网站的经验
  • vue.js框架原理浅析
  • vue2.0项目引入element-ui
  • VuePress 静态网站生成
  • 闭包--闭包作用之保存(一)
  • 基于webpack 的 vue 多页架构
  • 前端设计模式
  • 如何编写一个可升级的智能合约
  • 字符串匹配基础上
  • NLPIR智能语义技术让大数据挖掘更简单
  • 我们雇佣了一只大猴子...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (八)c52学习之旅-中断实验
  • (差分)胡桃爱原石
  • (定时器/计数器)中断系统(详解与使用)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (算法二)滑动窗口
  • (循环依赖问题)学习spring的第九天
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)认识微服务
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)LINQ之路
  • .NET Core 成都线下面基会拉开序幕
  • .Net Remoting常用部署结构