【题解】 逆波兰表达式

article/2025/9/19 9:26:46

今天随机选题选到了这道题,这题比较经典,包含的知识点也不少,就在此与大家分享一下我的思路。

原题目:MFOJ P753-逆波兰表达式​​​​​

题目描述

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作3 4 - 5 +”:先3减去4,再加上5。

使用逆波兰记法的一个好处是不需要使用括号。

想知道更多关于逆波兰式的知识的同学们可以移步百度百科

格式

输入

输入一个逆波兰表达式,其中数字不超过 1000 项,各项间用一个空格隔开,保证式子正确,运算符只包括 加+、减-、乘*、除/

输出

输出其运算结果,保留 2 位有效数字。

示例

输入数据 1

1 2 + 3 * 2 /

输出数据 1 

4.50

限制 

1s, 1024KiB for each test case.

所有浮点数值的绝对值均小于 10^10。

思路

题目说数有可能是浮点,那就一律按浮点做吧

因为这种算式书写顺序的特殊性,我们不妨使用来做。 

想知道更多关于栈的知识的同学们也可以移步百度百科

思考一下,弄一个存放数的栈就行了,读取到运算符我就弹栈运算。

我的具体思路如下图所示:

 输入的一会是数一会是运算符,普通的读取方式显然不行,此时我们就要使用字符串了。

 另外,题目说明了保证算式一定正确,我们就不用再考虑是否合法什么的了,不过为了装逼保证程序运行结果正确,我们还是要判一下输入的是否就是一个数

bool Isanumber(char str[]){double ans=0,t=1;for(int i=strlen(str)-1;i>=0;i--){ans+=(str[i]-48)*t;t*=10;}if(ans==atof(str)) return true;//验证else return false;
}

这里用到了一个函数 atof(),它干的活就是把一个字符串转换成一个浮点数

*atof()函数需要头文件库<stdlib.h>

比如说 我有一个字符串char s[10]=“11451.4”,atof(s)的结果就是返回一个浮点数11451.4。

 言归正传。

 前面说过,输入的是个字符串,所以少不了处理亿下

 此处我的思路如下图所示:

  代码:

double trans(int a){double ans=0;int cnt=0;char digits[900700]="";for(int i=a;str[i]!=' ';i++){digits[cnt]=str[i];cnt++;}ans=atof(digits);return ans;
}

也别忘了计算!

double calc(double a,double b,char opr){if(opr=='+') return a+b;else if(opr=='-') return a-b;else if(opr=='*') return a*b;else if(opr=='/') return a/b;
}

搞清楚了这些,就该加上栈了!

那么,最终的代码也就来了!

#include<bits/stdc++.h>
using namespace std;
char str[900700];
std::stack <double> stk;//定义栈
double trans(int a){double ans=0;int cnt=0;char digits[900700]="";for(int i=a;str[i]!=' ';i++){digits[cnt]=str[i];cnt++;}ans=atof(digits);return ans;
}
double calc(double a,double b,char opr){if(opr=='+') return a+b;else if(opr=='-') return a-b;else if(opr=='*') return a*b;else if(opr=='/') return a/b;
}
bool Isanumber(char str[]){double ans=0,t=1;for(int i=strlen(str)-1;i>=0;i--){ans+=(str[i]-48)*t;t*=10;}if(ans==atof(str)) return true;else return false;
}
int main(){cin.getline(str,900600);//读取算式(带有空格)if(Isanumber(str)==true){//判断输入的是否为单个数cout<<fixed<<setprecision(2)<<atof(str);return 0;}double tmp,a,b;for(int i=0;str[i];i++){if(str[i]>='0'&&str[i]<='9'){//读取数tmp=trans(i);stk.push(tmp);while (str[i]!=' ') i++;//从前向后读取,读到空格就结束}else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){//读到运算符,开始运算b=stk.top();//弹出第二个待运算数stk.pop();a=stk.top();//弹出第一个待运算数stk.pop();stk.push(calc(a,b,str[i]));//计算,并将结果压回栈里}}cout<<fixed<<setprecision(2)<<stk.top();return 0;
}

(这里的警告不用管他) 

希望本题解能帮到同学们!


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

相关文章

【JAVA】---逆波兰表达式

一. 逆波兰表达式的介绍 逆波兰表达式又称为后缀表达式&#xff0c;代表的含义是操作数在前&#xff0c;运算符在后。 比如&#xff1a;12&#xff0c;用逆波兰表达式来写的话&#xff0c;就是12。 而12这种写法称为中缀表达式&#xff0c;即运算符在两个操作数之间&#xff0c…

逆波兰表达式题解

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式&#xff0c;例如普通的表达式2 3的逆波兰表示法为 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系&#xff0c;也不必用括号改变运算次序&#xff0c…

C++题解 | 逆波兰表达式相关

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C/C相关题解 &#x1f38a;每篇一句&#xff1a; 图片来源 A year from now you may wish you had started today. 明年今日&#xff0c;你会希望此时此刻的自己已经开始行动了。 文章目录 &#x1f307;前言…

(详细图解) 逆波兰表达式

下面给出图解: 下面给出代码: class Solution { public:int evalRPN(vector<string>& tokens) {stack<int> st;//循环遍历表达式 范围forfor(const auto& str : tokens) {if(str "" || str "-"|| str "*" || str &quo…

详解逆波兰表达式的转换与表达式求值

对于计算一个算式 如 : 3*(56)-2 这种算式叫做中缀表达式, 人们看着会比较方便, 如果用计算机直接计算会很麻烦,所以要把中缀表达式变为计算机易于理解的后缀表达式来计算. 后缀表达式又叫逆波兰表达式, 把运算量写在前面, 把运算符写在后面, 并且可以去掉括号 如 ab 变为 …

逆波兰表达式(后缀表达式)C++实现

1 何谓逆波兰表达式 逆波兰表达式又称为后缀表达式&#xff0c;是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法。 例如&#xff1a; 1 2 3&#xff0c;转换为逆波兰表达式&#xff1a;1 2 3 。 1 2 * 3&#xff0c;转换为逆波兰表达…

将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值。

要求&#xff1a;设计一个算法&#xff0c;将一般算术表达式转化为逆波兰表达式&#xff0c;并求逆波兰表达式的值。 实现思路 获取一个中缀表达式将表达式转换为后缀表达式计算后缀表达式的结果 中缀表达式转换为后缀表达式的几个关键部分 假如不是运算符&#xff0c;则输…

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

文章目录 波兰表达式逆波兰表达式波兰表达式计算逆波兰表达式计算总结 常见的算术表达式&#xff0c;称为中缀表达式&#xff0c;例如&#xff1a; 5 ( 6 – 4 / 2 ) * 3波兰表达式 波兰表达式也称为前缀表达式&#xff0c;以上面的例子为例&#xff0c;其波兰表达式为&…

逆波兰表达式

逆波兰表达式在维基百科上的解释&#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…