[算法] 逆波兰表达式(栈实现)

逆波兰表达式介绍及求值实现 1. 初始化两个:运算符s1和存储中间结果的s2 2. 从左至右扫描中缀表达式 3. 遇到操作数时,将其压s2 4. 遇到运算符时,比较其与s1顶运算符的优先级 1. 如果s1为空,或顶运算符为左括号“(”,则直接将此运算符入 2. 否则,若优先级比顶运算符的高,也将运算符压入s1 3. 否则,将s1顶的运算符弹出并压入到s2中,再次转到(4.1)与s1中新的顶运算符相比较 5. 遇到括号时: 1. 如果是左括号“(”,则直接压入s1 2. 如果是右括号“)” 阅读详情

问题

  • 计算给定的逆波兰表达式的值,有效操作只有+/+−∗/,每个操作数都是整数;
  • 例如:
    • ”2”, “1”, “+”, “3”, “*” : 9,(2+1)*3
    • “4”, “13”, “5”, “/”, “+” : 6,4+(13/5)

分析

  • 对于逆波兰表达式abc-d*;
  • 若当前字符是操作数,则压栈;
  • 若当前字符是操作符,则弹出栈中的两个操作数,计算后仍然压入栈中:
    • 若某次操作,栈中无法弹出两个操作数,则表达式有误

代码实现

代码实现如ReversePolishNotation.hpp所示:

#ifndef ReversePolishNotation_hpp
#define ReversePolishNotation_hpp

#include <stdio.h>

// 判断给定字符串是否为操作符
bool isOperator(const char* token) {
    return ((token[0] == '+') || (token[0] == '-') || (token[0] == '*') || (token[0] == '/'));
}

// 计算逆波兰表达式的值
int computeReversePolishNotation(const char* str[], int size) {
    std::stack<int> s;
    int a, b;
    const char* token;
    for (int i = 0; i < size; i++) {
        token = str[i];
        if (!isOperator(token)) {
            s.push(atoi(token));
        } else {
            b = s.top();
            s.pop();
            a = s.top();
            s.pop();
            if (token[0] == '+') {
                s.push(a+b);
            } else if(token[0] == '-') {
                s.push(a-b);
            } else if(token[0] == '*') {
                s.push(a*b);
            } else if(token[0] == '/') {
                s.push(a/b);
            }
        }
    }
    return s.top();
}
#endif /* ReversePolishNotation_hpp */

测试代码main.cpp:

#include "ReversePolishNotation.hpp"

int main(int argc, const char * argv[]) {
    const char* str[] = {"2", "1", "+", "3", "*"};
    int value = computeReversePolishNotation(str, 5);
    printf("%d\n", value);
    return 0;
}
逆波兰算法(后缀表达式实现数学表达式计算 逆波兰算法(Reverse Polish Notation, RPN) 阅读详情

相关推荐

C++实现表达式求值:从应用到逆波兰表达式算法详解

表达式求值是计算机科学中的基础算法问题,其核心在于将人类习惯的中缀表达式转换为计算机易于处理的形式。该算法通常基于数据结构实现,通过调度场算法将中缀表达式转换为后缀表达式逆波兰表达式),从而消除运算符优先级和括号带来的歧义。这一技术不仅体现了数据结构中的经典应用,更是编译原理中语法分析和解释执行思想的微型实践。在工程实践中,表达式求值算法是计算器、编译器、解释器等软件的核心引擎,广泛应用于科学计算、编程语言实现和嵌入式系统等领域。本文通过C++实现一个简易计算器,详细拆解了词法分析、中缀转后缀、后缀求

weixin_42563415的博客 243

计算逆波兰表达式

本文教你代码实现逆波兰表达式的计算

逐梦苍穹的博客 1838

【数据结构】——逆波兰表达式

逆波兰表达式简介 假设有一天赵地佐同学(名称纯属虚构,如有雷同,纯属巧合)拿着一道数据极其恐怖的四则运算题找到同班的张三同学,希望他在1s内能给出答案。这时最好的办法是什么呢?当然是不理他,可惜乐于探究的张三同学并不愿意放弃这个机会,于是他拿出了随身携带的笔记本电脑。 为了解决这个问题,让我们尽可能抽象一下四则运算的表达式: ans=A+B/C+(D*E+F)*G 像上面这种符合人们认知习惯自然书写而成的数学表达式称为中缀表达式。但可惜的是,愚蠢的计算...

m0_52447591的博客 1万+

逆波兰表达式实现表达式计算

表达式求值计算,如计算1+((2+3)*4)-5的值。 我的思路是先把表达式转换为逆波兰表达式,因为逆波兰表达式更加符合计算机的处理逻辑,把表达式转换为逆波兰表达式算法如下: 初始化两个:运算符s2和储存中间结果的s1; 从左至右扫描中缀表达式; 遇到操作数时,将其压s1; 遇到运算符时,比较其与s2顶运算符的优先级: 如果s2为空,或顶运算符为左括号“(”,则直接将此运算...

swh1314的博客 1596

逆波兰表达式(后缀表达式

目录啊一、什么是逆波兰表达式?二、中缀表达式转后缀表达式三、代码实现后缀表达式的计算 一、什么是逆波兰表达式逆波兰表达式又叫做后缀表达式逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。(摘自百度百科) 我们再来看看什么是中缀表达式…其实。中缀表达式就是我们平时书写的数学表达式。比如: 2 + 3 * 5 ( 2 + 3 )

就这样吧 1万+

TypeScript算法题实战——与队列篇(和队列的实现,括号表达式逆波兰表达式

和队列是数据结构中极为重要的基础,和队列都是一种线性表, 和链表顺序表相同, 但和队列各自具有各自的特性, 所以是一种特殊的线性表。队列是先进先出,是先进后出。 本系列博文将通过一些**力扣算法**题目学习TypeScirpt,这篇将以和队列为主题边学习TypeScipt边实战算法

白洞,白色的明天在等着我们 1262

数据结构和算法java实现——和前缀、中缀、后缀表达式(逆波兰表达式)

数据结构和算法java实现—— 1 概述 的英文为(stack) 是一个先入后出(FILO-First In Last Out)的有序列表。 (stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为(Top),另一端为固定的一端,称为(Bottom)。 根据的定义可知,最先放入中元素在底,最后放入的元素在顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除 进和出 基于结构的特点,在实际

Chris683的博客 454

C++实现逆波兰表达式计算器:与调度场算法详解

在计算机科学中,(Stack)是一种基础且重要的数据结构,遵循后进先出(LIFO)原则,广泛应用于函数调用、表达式求值等场景。其核心原理是通过压和弹操作管理数据,能高效处理具有嵌套或顺序依赖关系的问题。在表达式求值领域,的技术价值尤为突出,它为解决中缀表达式(如 `3+4*2`)的复杂优先级和括号问题提供了优雅方案。通过调度场算法,可将中缀表达式转换为无需括号的后缀表达式逆波兰表达式),再利用进行线性扫描求值,极大简化了计算逻辑。这一技术是编译器前端、解释器及计算器应用的核心基础。本文以C++工

weixin_32183107的博客 304

数据结构与算法--Python 实现综合计算器和逆波兰计算器 前缀表达式 中缀表达式 后缀表达式 逆波兰表达式

Python 实现综合计算器和逆波兰计算器

storyfull 1240

的应用(三)之C语言实现逆波兰表达式

今天是清明节放假的第一天,博主也没闲着(拒绝偷懒),早上起来看了数据结构。今天就趁热打铁来讲讲《的应用之C语言实现逆波兰表达式》吧。 波兰表达式存在的意义就是使运算式中即使没有括号,也可以执行正确的运算顺序。例如a+b的波兰表达式可以写作+ab,逆波兰表达式则是ab+。 实现逻辑: 1.首先我们拿到一个存放运算式的字符串。创建一个符号,用来放-+x/(). 2.对字符串逐一扫描。如果是数字我们直接输出。 3.如果是运算符,而且此时符号空着的话就直接放进去。如果不是,我们就比较顶符号与扫描符号的优

m0_63932570的博客 4251

算法训练营 day07,08,09合集 用实现队列,用队列实现,有效的括号,删除字符串中的所有的相邻重复项,逆波兰表达式求值

这里会出现三种情况,左括号多余,右括号多余和左右括号数量匹配但类型不匹配,实现思路是遍历到左括号时,向中加入对应的右括号,遍历到右括号时,判断与当前顶是否相等,不相等说明是第三种情况,false,如果相等,将顶元素弹出继续遍历,如果遍历右括号过程中内元素为空,说明右括号多余,false,最后判断是否为空,不为空则是左括号多余,为空返回true。输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]

m0_62171045的博客 85

Java数据结构与算法-逆波兰表达式)原理及代码实现

(中缀表达式转后缀表达式)原理及代码实现 1. 逆波兰表达式的介绍 2. 中缀转后缀的原因 3. 存储特点和原理 4. 实现中缀转后缀的思路 5. 代码实现 6. 注意事项 一,逆波兰表达式的介绍 前缀: 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 中缀:不再多说。 后缀: 逆波兰表达式,与前缀表达式...

大美妞的博客 5249

算法学习记录~2023.4.21~与队列Day1~232.使用实现队列 & 225.用队列实现 & 20.有效的括号 & 150. 逆波兰表达式求值

抽象化理解和队列有助于思考这道题尽量复用逻辑功能类似的函数,并且不要通过复制粘贴的方式入:同队列出:使用第二个队列用于备份原队列中除了需要被pop外的其他所有元素,此时原队列剩下的即为所求值,最后再从备份队列中复制回去,并清除备份队列顶:即为队列尾判断为空:原队列为空则为空力扣题目链接由于结构的特殊性,非常适合做对称匹配类的题目。主要需要分析出特殊情况有哪些以及怎么处理。此解法非常暴力但思路非常清晰。不过使用replace不符合力扣的要求,同时这样也会极大增加时间和空间复杂度。

Viator_mp3的博客 785

【leetcode/逆波兰表达式的应用(的使用)

题目描述: 根据逆波兰表示法,求表达式的值。 有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) ...

qq_43338695的博客 190

利用实现对后缀表达式逆波兰表达式)的求解(C代码实现

我们最熟悉的表达式:1+2,(1+2)3,3+42+4等等都是中缀表示法。对于人们来说,也是最直观的一种求值方式,先算括号里的,然后算乘除,最后算加减,但是,计算机处理中缀表达式却并不方便,因为没有一种简单的数据结构可以方便从一个表达式中间抽出一部分算完结果,再放进去,然后继续后面的计算。而逆波兰表达式则可以轻松解决这一问题。   逆波兰表达式:   逆波兰表达式又叫后缀表达式。它是由相应的语法树...

苍之羽 1万+

数据结构与算法_——逆波兰表达式求值 _python实现

先告诉你两个知识点: 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前,这里所说的表达式就是我们平时进行数学运算时所用的数学表达式。 后缀表达式就是标题所说的逆波兰表达式,和我们平时把运算符号位于操作数之间不同,后缀表达式将运算符置于操作数之后。 举例说明:6-1+3*2 = 11就是一个中缀表达式。 对应的波兰式,即前缀表达式为:[’-’, ‘6’, ‘1’, ‘*’, ‘+’ ,‘3...

qq_44273739的博客 715

代码随想录笔记|C++数据结构与算法学习笔记-和队列()|232.用实现队列、225. 用队列实现、20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

其实我们只需要把元素1取出来加入队列的队尾,把元素2取出来加入队列的队尾,这样元素3就到队列的出口了,我们就可以先弹出元素3。我们现在遍历到第二个b,然后顶元素也是b,那么就消除,一下个遍历a,但是由于顶的b被消除了,此时的顶是a,然后我们再次完成消除,最后遍历c、a。用来存我们遍历过的元素,我们每遍历一个元素,都去里面询问一下,我之前有没有遍历a,我的前一个字母是a吗。我们从第一个符号开始遍历,每遍历一次,我们把它的右括号入,然后等到匹配的时候,对应出即可。把A的数据出,压入到B中。

糖炒栗子 678

C++算法类经典题--的压入、弹出序列 + 逆波兰表达式求值(的使用)+用实现队列

的压入、弹出序列 题目链接 class Solution { public: //拿入顺序去模拟出顺序,如果可以模拟出来,就是ok的,如果不能就不行。 bool IsPopOrder(vector<int> pushV,vector<int> popV) { stack<int> s; int i=0,j=0;//push序列的下标和pop序列的下标 while...

qq_53413129的博客 463
上一篇: [算法] 括号匹配问题
下一篇: [算法] 入栈出栈问题
zkp_java
博客等级 码龄15年 46粉丝 56原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值