逆波兰表达式求值

article/2025/9/19 9:09:49

二元运算符的表达式定义为:(操作数) + (运算符) + (操作数) ,其中操作数也可以为表达式。
在计算机中,根据运算符所在的不同位置来命名,表达式可以有如下三种不同的表示方法:
记表达式为:Exp = S1 + OP + S2, S1和S2为操作数,OP为运算符。
则称 OP + S1 + S2 为表达式的前缀表示法;
称 S1 + OP + S2 为表达式的中缀表示法;
称 S1 + S2 + OP 为表达式的后缀表示法。

例如,对于表达式 Exp = a * b + (c - d / e) * f
前缀表达式为: + * a b * - c / d e f
中缀表达式为: a * b + c - d / e * f
后缀表达式为: a b * c d e / - f * +

对于这三种表达式,操作数之间的相对次序不变,而运算符的相对次序却不同。前缀表达式的运算规则为:连续出现的两个操作数和在它们 之前且紧靠它们的运算符构成一个最小表达式。中缀表达式由于丢失了括号信息,从而导致运算的次序不确定。后缀表达式是波兰逻辑学家 Jan.Lukasiewicz 发明的,通常又称为逆波兰表达式,它不需要括号,运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。

利用逆波兰表达式进行求值,对我们人类来说是不大好接受的,但是对计算机来说却是非常方便的,因为利用栈就能够很容易实现。具体的求值方法是先找运算符后找操作数。下面通过图示来进行分析。
例如对于表达式:1.3 * 2 + (5.1 - 3.6 / 2) * 4,其逆波兰表达式为:1.3 2 * 5.1 3.6 2 / - 4 * +

利用栈来对逆波兰表达式求值过程如下:
① 建立一个栈,首先将操作数 1.3 和 2 入栈,遇到 * 运算符则依次弹出两个元素进行运算,并把运算结果入栈。这里依次将 2 和 1.3 弹出执行 1.3*2 运算,把结果为 2.6 入栈。
这里写图片描述

② 将 5.1、3.6、2 依次入栈,遇到 / 运算符则依次将 2 和 3.6 弹出执行 3.6/2 运算, 把结果1.8 入栈。
这里写图片描述

③ 遇到 - 运算符则将1.8 和 5.1 依次弹出执行 5.1 - 1.8 运算, 把结果 3.3 入栈。
这里写图片描述

④ 将 4 入栈,遇到 * 运算符则依次将 4 和 3.3 弹出执行 3.3 * 4,把结果 13.2 入栈。
这里写图片描述

⑤ 遇到 + 运算符则依次将 13.2 和 2.6 弹出执行 2.6 + 13.2,把结果 15.8 入栈。然后没有数据需要入栈,将 15.8 弹出即为最终运算结果。
这里写图片描述

接下来考虑代码的实现。我们在逆波兰表达式的输入最后加一个 # 表示输入的结束。建立一个存放 double 型数字的栈,用一个数组存放需要输入的操作数的每个字符(包括小数点),操作符和运算符之间用空格隔开。利用 C++ 中的容器适配器 stack 可以写出 C++ 代码如下:

#include <iostream>
#include <stack>
using namespace std;const int MAXBUFFER = 10;int main()
{stack<double> s;char c;double d, e;char str[MAXBUFFER];int i = 0;cout << "请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志:" << endl;c = getchar();while (c != '#'){while (isdigit(c) || c == '.'){str[i++] = c;str[i] = '\0';if (i >= 10){cout << "错误:数字太大了!" << endl;return -1;}c = getchar();if (c == ' '){d = atof(str);  // 把字符串转换成浮点数s.push(d);i = 0;break;}}switch ( c ){case '+':e = s.top();s.pop();d = s.top();s.pop();s.push(d + e);break;case '-':e = s.top();s.pop();d = s.top();s.pop();s.push(d - e);break;case '*':e = s.top();s.pop();d = s.top();s.pop();s.push(d * e);break;case '/':e = s.top();s.pop();d = s.top();s.pop();if (e != 0){s.push(d / e);}else{cout << "错误:除数为零" << endl;return -1;}break;}c = getchar();}cout << "运算结果为: " << s.top() << endl;s.pop();return 0;
}

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

相关文章

逆波兰表达式 c++

题目&#xff1a; 逆波兰表达式定义&#xff1a;1&#xff09;一个数是一个逆波兰表达式值为该数 2&#xff09;运算符 逆波兰表达式 逆波兰表达式 是其表达式&#xff0c;只有两个逆波兰表达式的值运算的结果 思路&#xff1a;用递归解决递归形式问题。 #include <iostr…

波兰表达式和逆波兰表达式

波兰表达式和逆波兰表达式 今天zxy的实验内容是关于逆波兰表达式的计算&#xff0c;刚好最近在做关于数据结构的习题&#xff0c;于是想着对波兰表达式和逆波兰表达式的转化和运算分别进行一个学习&#xff0c;于是写了这篇博客(有错的地方欢迎大家指出。) 常见的运算表达式&…

逆波兰表达式,走一波

逆波兰表达式又叫后缀表达式&#xff0c;中学时候学的那种表达式叫中缀表达式。 例如&#xff0c;5(63)3-1 &#xff0c; 3(4(21)2)-3 例子中的这两个式子&#xff0c;就是中缀表达式。下面这两个就是后缀表达式&#xff1a; 56331- &#xff0c; 342123- 中缀…

计算逆波兰表达式

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现 ⭐码云地址超链接(Gitee)&#xff1a;这里存放我学…

JavaScript逆波兰表达式求值

逆波兰表达式简介 逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。 逻辑提…

【题解】 逆波兰表达式

今天随机选题选到了这道题&#xff0c;这题比较经典&#xff0c;包含的知识点也不少&#xff0c;就在此与大家分享一下我的思路。 原题目&#xff1a;MFOJ P753-逆波兰表达式​​​​​ 题目描述 逆波兰记法中&#xff0c;操作符置于操作数的后面。例如表达“三加四”时&…

【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…