波兰表达式与逆波兰表达式

article/2025/9/19 10:33:49

文章目录

    • 波兰表达式
    • 逆波兰表达式
    • 波兰表达式计算
    • 逆波兰表达式计算
    • 总结

常见的算术表达式,称为中缀表达式,例如:

5 + ( 64 / 2 ) * 3

波兰表达式

波兰表达式也称为前缀表达式,以上面的例子为例,其波兰表达式为:

+ 5 * - 6 / 4 2 3

中缀表达式转换前缀表达式的操作过程为:

(1)首先设定一个操作符栈,从右到左顺序扫描整个中缀表达式:

  • 如果是操作数,则直接归入前缀表达式;

  • 如果是括号:如果是右括号,则直接将其入栈;如果是左括号,则将栈中的操作符依次弹栈,归入前缀表达式,直至遇到右括号,将右括号弹栈,处理结束;

  • 如果是其他操作符,则检测栈顶操作符的优先级与当前操作符的优先级关系,如果栈顶操作符优先级大于当前操作符的优先级,则弹栈,并归入前缀表达式,直至栈顶操作符优先级小于等于当前操作符优先级,这时将当前操作符压栈。

(2)当扫描完毕整个中缀表达式后,检测操作符栈是否为空,如果不为空,则依次将栈中操作符弹栈,归入前缀表达式。

(3)最后,将前缀表达式翻转,得到中缀表达式对应的前缀表达式。

逆波兰表达式

逆波兰表达式也称为后缀表达式,以上面的例子为例,其逆波兰表达式为:

5 6 4 2 / - 3 * +

中缀表达式转换后缀表达式的操作过程为:

(1)自左向右顺序扫描整个中缀表达式;

  • 如果当前元素为操作数,则将该元素直接存入到后缀表达式中;

  • 如果当前元素为“(”,则将其直接入栈;如果为“)”,则将栈中的操作符弹栈,并将弹栈的操作符存入到后缀表达式中,直至遇到“(”,将“(”从栈中弹出,并不将其存入到后缀表达式中;

  • 如果是其他操作符,如果其优先级高于栈顶操作符的优先级,则将其入栈,如果是小于或低于站定操作符优先级,则依次弹出栈顶操作符并存入后缀表达式中,直至遇到一个栈顶优先级小于当前元素优先级时或者栈顶元素为“(”为止,保持当前栈顶元素不变,并将当前元素入栈;

(2)当扫描完毕整个中缀表达式后,检测操作符栈是否为空,如果不为空,则依次将栈中操作符弹栈,归入后缀表达式。

下面程序演示如何将一个中缀表达式转换为后缀表达式:

/*** 中缀表达式 -- >逆波兰表达式* @author jitwxs* @since 2018/10/18 16:39*/
public static String niBoLan(String src) {Stack<Character> stack = new Stack<>();StringBuilder sb = new StringBuilder();char tmp;for (int i = 0; i < src.length(); i++) {char c = src.charAt(i);if (Character.isDigit(c)) { // 如果是数字,直接输出sb.append(c);} else if (c == '(') { // 如果是左括号,直接入栈stack.push(c);} else if (c == ')') { // 如果是右括号,全部出栈输出,直到遇见左括号【左括号不输出】while ((tmp = stack.pop()) != '(') {sb.append(tmp);}} else {// 如果是操作符,如果操作符比栈顶小,将栈顶元素出栈输出,直到操作符大于等于栈顶。最后将操作符入栈。while (!stack.empty() && getPriority((tmp = stack.peek())) > getPriority(c)) {sb.append(tmp);stack.pop();}stack.push(c);}}// 输出结束后,如果操作符栈非空,全部出栈while (!stack.empty()) {sb.append(stack.pop());}return sb.toString();
}/*** 获取优先级* @author jitwxs* @since 2018/10/18 16:42*/
public static int getPriority(Character op) {switch(op){case '+':case '-':return 1;case '*':case '/':return 2;default:return 0;}
}

波兰表达式计算

  1. 对前缀表达式从后向前扫描,设定一个操作数栈,如果是操作数,则将其直接入栈。

  2. 如果是操作符,则从栈中弹出操作符对应的操作数进行运算,并将计算结果压栈。

  3. 直至从右到左扫描完毕整个前缀表达式,这时操作数栈中应该只有一个元素,该元素的值则为前缀表达式的计算结果。

逆波兰表达式计算

  1. 从左到右顺序扫描整个后缀表达式;

  2. 如果是操作数,则将该操作数压入到栈中;

  3. 如果是操作符,则从栈中弹出对应的操作数,注意操作数的顺序;根据操作符进行运算,并将结果重新压入到栈中;

  4. 直至将整个栈扫描完毕;

  5. 如果后缀表达式是合法的,则扫描完毕后,栈中只有一个元素,该元素的值即为后缀表达式的结果。

/*** 计算逆波兰表达式数值* @author jitwxs* @since 2018/10/18 17:18*/
public static Integer calNiBoLan(String str) {Stack<Integer> numStack = new Stack<>();for(int i = 0; i<str.length(); i++) {char c = str.charAt(i);if(Character.isDigit(c)) {numStack.push(c - '0');} else {int b = numStack.pop();int a = numStack.pop();int tmp;switch (c) {case '+':tmp = a + b;break;case '-':tmp = a - b;break;case '*':tmp = a * b;break;case '/':tmp = a / b;break;default:tmp = 0;break;}numStack.push(tmp);}}return numStack.pop();
}

总结

(1)中缀转前缀/后缀

类别中缀转前缀中缀转后缀
操作符栈操作符栈
扫描顺序从右到左从左到右
遇到操作数直接归入直接归入
遇到右括号直接入栈将栈中操作符依次弹栈,归入,直至遇到左括号,将左括号弹栈,处理完毕
遇到左括号将栈中操作符依次弹栈,归入,直至遇到右括号,将右括号弹栈,处理完毕直接入栈
遇到其他操作符检测栈顶操作符优先级与当前操作符优先级关系,如果栈顶大于当前,则出栈,归入,直至栈顶小于等于当前,并将当前操作符入栈检测栈顶与当前优先级关系,如果栈顶大于等于当前则出栈,归入,直至栈顶小于当前,并将当前操作符入栈
操作符栈中的优先级从栈底到栈顶操作优先级:非递减。即:栈顶可以大于或等于下面的从栈底到栈顶优先级:递增。即:栈顶必须大于下面的
是否翻转翻转无需翻转

(2)前缀/后缀表达式计算

类别前缀表达式计算后缀表达式计算
扫描顺序从右到左从左到右
操作数栈操作数栈
遇到操作数时压栈压栈
遇到操作符时出栈出栈
出栈的顺序先弹出操作数a,后弹出b先弹出操作数b,后弹出a
结果操作数栈中唯一元素的值操作数栈中唯一元素的值

http://chatgpt.dhexx.cn/article/IFRHsYGT.shtml

相关文章

逆波兰表达式

逆波兰表达式在维基百科上的解释&#xff1a;逆波兰表示法&#xff08;Reverse Polish notation&#xff0c;RPN&#xff0c;或逆波兰记法&#xff09;&#xff0c;是一种是由波兰数学家扬武卡谢维奇1920年引入的数学表达式方式&#xff0c;在逆波兰记法中&#xff0c;所有操作…

【数据结构】-------逆波兰表达式(C++)

文章目录 逆波兰表达式讲解正常表达式转换到逆波兰表达式栈操作逆波兰表达式的原理多位数压入栈操作代码例题 逆波兰表达式讲解 逆波兰表达式-----是数据结构的应用&#xff0c;你要单独说讨论它的话没有多大意义&#xff0c;如果我们结合数据结构中的栈来讲解的话&#xff0c…

什么是逆波兰表达式?

文章目录 1. 题目描述2. 解题思路3. 动图演示4. 代码实现 1. 题目描述 2. 解题思路 逆波兰表达式由波兰的逻辑学家卢卡西维兹提出&#xff0c;它的特点是&#xff1a;没有括号&#xff0c;运算符总是放在和它相关的操作数之后。因此&#xff0c;逆波兰表达式也称后缀表达式&am…

微信网页开发中授权headimgurl有的为空

微信网页开发授权&#xff0c;有的用户头像链接为空。 微信开发文档&#xff1a;https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html headimgurl用户头像&#xff0c;最后一个数值代表正方形头像大小&#xff08;有0、46、64、…

微信开发——网页授权

微信开发——网页授权 前期准备前端后端 前期准备 ①微信客户端中访问第三方页面&#xff0c;公众号可以通过网页登陆授权&#xff0c;获取微信用户的基本信息&#xff08;头像、昵称等&#xff09;&#xff0c;实现业务逻辑。一切按照官方文档说明开发。 ②安装微信开发者工具…

微信公众号微信网页开发网页授权/回调自定义参数问题处理方法。

微信公众号页面授权回调自定义参数问题 我们知道微信页面回调接口&#xff0c;获得用户信息后&#xff0c;回调地址&#xff1a; redirect_uri&#xff1a;授权后重定向的回调链接地址&#xff0c; 请使用 urlEncode 对链接进行处理。 授权后跳转回页面&#xff1a; redirec…

微信网页开发--分享接口

流程 关于流程&#xff0c;在上一篇中已经有图介绍: 微信文档 微信JS-SDK说明文档 JSSDK使用步骤 首先确保已经获取了相关权限 步骤一&#xff1a;绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 备注&#xff1a;登录后…

微信网页开发样式库的使用

一、WeUI 是什么 WeUI 是一套同微信原生视觉体验一致的基础样式库&#xff0c;由微信官方设计团队为微信内网页和微信小程序量身设计&#xff0c;令用户的使用感知更加统一。在微信网页或小程序中使用 WeUI&#xff0c;有如下优势&#xff1a; 1. 同微信客户端一致的视觉效果…

微信网页开发(10)--扫一扫功能接口

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 背景2. 代码3. 测试 1. 背景 我们可以在微信网页调起扫一扫功能&#xff0c;可以识别一维码、二维码的内容&#xff0c;然后根据扫码结果实现我们的业务逻辑。 2. 代码 代码如下&am…

微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权自动登录业务系统)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权…

微信网页开发,禁止右上角微信复制分享链接JS

禁止微信右上角分享链接 开发网页时&#xff0c;为了提高网页链接的安全&#xff0c;不想让别人分享链接给别人 一般微信打开网页后&#xff0c;点击右上角是这样的 想要网页不能被复制&#xff0c;不能分享给其他人 效果图&#xff1a; 资源文件下载地址 下载地址 直接贴…

开发微信网页及调试方法

参考资料 Mac中怎么使用Nginx实现80端口转发8080端口 - 大数据 - 亿速云 使用代理映射解决微信页面调试难题 | 梦翼坊 微信开发工具里的域名必须是在微信公众号白名单里的域名,而npm run dev大多是localhost,所以为了方便调试,需要如下步骤 在Charles勾选Proxy-macOS Proxy…

微信网页开发之JS-SDK初使用

最近需要做一个页面&#xff0c;该页面使用微信浏览器打开&#xff0c;功能如下&#xff1a; 1、用户打开链接之后获取到用户的openId&#xff0c;用于支付、获取后台数据等场景 2、自定义分享链接、标题、图标、描述等 3、隐藏微信页面中的某些菜单项列表 阅读本文前需掌握…

微信网页开发--获取微信用户信息

流程 用户扫码或者直接点击链接进入我们的入口页面&#xff1b;进入授权登录页面&#xff0c;用户点击授权登录按钮&#xff1b;微信会自动将我么的网页授权域名后增加参数&#xff1b;根据微信给的code去获取当前登录的微信用户的用户信息。 具体操作过程 1.配置网页授权域名…

微信网页开发(4)--使用JSSDK基础接口

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. JSSDK接口2. 基础接口3. 开发流程3.1 绑定域名3.2 引入JS文件3.3 通过config接口注入权限验证配置3.5 调用基础接口 4. 小结 1. JSSDK接口 微信提供了很多JSSDK接口&#xff0c;包括基…

微信网页开发(8)--地理位置接口

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 背景2. 代码3. 测试 1. 背景 微信网页提供了获取当前地理位置经纬度&#xff0c;以及通过内置地图查看当前位置的接口。 官方接口说明如下&#xff1a; // 获取位置 wx.getLocation…

微信公众号开发——2、微信网页开发

第一部分、为公众号菜单嵌入网页 一、关键参考文档 微信JS-SDK说明文档 。 二、编辑模式嵌入网页 在公众号平台下&#xff0c;自定义菜单&#xff0c;添加菜单&#xff0c;并选择菜单内容跳转到指定页面地址即可&#xff08;需认证后方可添加页面地址&#xff0c;个人账号暂不…

微信网页开发配置整理

真是人越大记忆越差&#xff0c;断断续续做了几个微信小程序和微信h5项目&#xff0c;然鹅小程序的开发流程有些都忘了&#xff0c;最近刚做完一个微信h5网页开发的项目&#xff0c;所以赶紧记录下开发中需要注意的点&#xff0c;给自己往后回顾&#xff0c;同时也给第一次接入…

微信网页开发调试的一些方法

1. 微信开发者工具调试 微信开发者工具下载 不过多介绍, 下载安装, 就能开始小程序开发和公众号网页开发. 2. 微信内自带调试 微信内打开网页 http://debugx5.qq.com (仅支持Android微信) 打开下面两项&#xff0c;就可以调试了 3. 使用vConsole插件 1. 下载vConsole插件…

前端对接微信公众号网页开发流程,前期配置

微信公众号网页开发&#xff0c;其实就是我们开发的h5网页需要放到微信浏览器环境中使用&#xff0c;但是需要对接公众号授权&#xff0c;授权之后可以获取到用户的个人信息&#xff0c;以及可以使用公众号提供的一些API,如&#xff1a;图片上传、图片预览、获取位置信息、微信…