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

article/2025/9/19 10:48:39

文章目录

  • `逆波兰表达式讲解`
  • `正常表达式转换到逆波兰表达式`
  • `栈操作逆波兰表达式的原理`
  • 多位数压入栈操作
  • `代码例题`

逆波兰表达式讲解

逆波兰表达式-----是数据结构的应用,你要单独说讨论它的话没有多大意义,如果我们结合数据结构中的来讲解的话,你将会对它有另一方面的认识。
让我们来看一下面表格:

正常表达式逆波兰表达式
(1+2)*(3-4)12+34-*

但大家看到可能不会太懂,听我慢慢说:

左边这个正常表达式又叫做中缀表达式,什么是中缀表达式呢?简单来说就是把操作符放到操作数的中间。

右边这个叫做逆波兰表达式,又叫做后缀表达式,那什么又叫后缀表达式呢,和什么理解一样, 顾名思义就是把操作符放到操作数后面。

带大家看看几个简单逆字波兰表达式的:

中缀表达式逆波兰表达式
(a+b)ab+
(a-b)ab-
(a*b)ab*

目前我们只考虑这三种,除法的话计算机处理起来很麻烦,所以就先不考虑这个,我们主要是理解这种思想和栈的一种用法。

还有一点,我们将操作数压入栈时,是以字符形式压入的,你输入1,计算机会把它以字符 ‘1’ 的形式压入,除非你对它进行特殊操作。

正常表达式转换到逆波兰表达式

简单来说就是把操作符放到操作数后面,先看简单的:
a+b
1+2 —> 12+

ab
2
3 —> 23*

a-b
3-4 —> 34-

稍微复杂一点的:
(1+2)*(2 *5)

  1. (1+2)(2*5) *
  2. 12+(2*5) *
  3. 12+25**

(1+2)* (2*5) ---- > 12+25 * *

复杂一点的:
5*(((9+8)*(4 * 6))+7)

  1. 5(((9+8)* (4 * 6))+7)*
  2. 5((9+8)* (4 * 6))7+*
  3. 5(9+8)(4*6)*7+ *
  4. 598+46**7+*

5*(((9+8)* (4 * 6))+7)----> 598+46**7+*

栈操作逆波兰表达式的原理

一个这样逆波兰表达式:12+34-* —> 原型:(1+2)*(3-4)
计算机要利用栈操作来计算这个表达式的话,就要用到下面的原则:
-依次存入1和2,然后遇到操作符 ‘+’,就会把1 和 2 从栈里面取出来相加,然后把结果重新放到栈里面;
-再接着存入3 和 4,然后又遇到操作符 ‘-’ ,再把3和4取出来相加,结果存到栈里面;
-现在栈内已经有两个数了,接着存入,遇到 ‘ * ’,再把两个数取出来相乘,结果重新存到栈里,这样就可以得到整个表达式的结果了。看图解:
在这里插入图片描述

注: 栈是先入后出,后入先出,在做减法或除法时要把先入栈的数作为被减数或被除数(3-4)。

多位数压入栈操作

  • 要将多位数压入栈的操作当然不能和个位数的一样,比如说将30 这个数压入栈的的话,就要做一些特殊的操作,具体如下:
string  str;
while(st[i] >= '0' && st[i] <= '9')
{str += st[i];//遇到第一个数字放到字符串中while(st[i] >= '0' && st[i] <= '9'){str += st[i];//遇到第二个数字放到拼接到字符串中,就可以得到一个多位数了}push(stoi(str));//将多位数存入到栈里面
}

注:计算机存入的数字是字符,需要转换一下,一种方法是st[i] - '0' ;另一种是用一个函数stoi() , 这个函数是将用string定义的字符串转换为对应的数字。

代码例题

//这是栈应用的一个实例,逆波兰数
//(1+2)*(3-4)
//逆波兰表示法:  (1+2)(3-4)*
//                  12+34-*
//5*(((9+8)*(4*6))+7)
//逆波兰表示法:5((9+8)*(4*6))7+*
//              5(9+8)(4*6)*7+*
//              598+46**7+*#include<iostream>
#include<cstring>const int MAX = 512;
int top[MAX];//创建一个栈
int num = 0;
using namespace std;bool is_full();//判断栈是否为满
bool is_temp();//判断栈是否为空
void push(int);//入栈操作
int  pop();//出栈操作int main()
{char st[100];//存放逆波兰数,但存放的是字符cout << "请输入逆波兰表达式:" << endl;cin >> st;int line = strlen(st);//计算出波兰数的长度for(int i = 0; i < line; i++){//利用循环依次将字符存入到栈str += st[i];while(st[i] >= '0' && st[i] <= '9'){str += st[i];//遇到第二个数字放到拼接到字符串中,就可以得到一个多位数了}push(stoi(str));//将多位数存入到栈里面}else{int n = pop();//取出后入的两个数int m = pop();switch(st[i]){case '+'://遇到‘+’就将两个数相加push(m + n);break;case '*':push(m * n);//遇到‘*’就将两个数相加break;case '-':push(m - n);//遇到‘-’就将两个数相加break;}}}cout << "result: " << pop() << endl;//最后得出结果return 0;
}bool is_full()
{return num == MAX;
}bool is_temp()
{return num == 0;
}void push(int ch)
{if(!is_full()){top[num++] = ch;}elsecout << "栈已满。" << endl;
}int  pop()
{if(!is_temp()){return top[--num];}elsecout<< "栈已为空。" << endl;}

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

相关文章

什么是逆波兰表达式?

文章目录 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;图片上传、图片预览、获取位置信息、微信…

微信网页开发(3)--微信网页授权

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 什么是授权2. 两种授权方式3. 网页授权access_token和普通access_token4. 网页授权流程5. 网页授权代码开发5.1 项目搭建5.2 修改配置文件5.3 开发启动类5.4 开发公众号配置类5.5 开发…

微信网页开发:微信内h5使用wx-open-launch-weapp打开小程序,微信内h5使用wx-open-launch-app打开App的方案

需求场景&#xff1a; 当我们需要使用在微信客户端打开的h5页面&#xff0c;在页面上打开微信小程序或者唤起App时&#xff0c;我们需要使用微信js-sdk提供的开放标签能力。这其中&#xff1a;使用wx-open-launch-weapp标签打开微信小程序&#xff1b;使用wx-open-launch-app跳…