首页 > 其他分享 >逆波兰表达式求值

逆波兰表达式求值

时间:2024-08-30 19:23:49浏览次数:11  
标签:操作数 num1 压栈 stk tokens 波兰 求值 表达式

这段代码实现了一个用来计算逆波兰表达式(Reverse Polish Notation, RPN)的算法。逆波兰表达式是一种后缀表达式,操作符在操作数的后面。这个算法通过使用栈来逐步求值表达式中的操作数和操作符。

代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param tokens string字符串vector 
     * @return int整型
     */
    int evalRPN(vector<string>& tokens) {
        // 定义一个整数栈,用于存储操作数
        stack<int> stk;
        
        // 遍历所有的 tokens
        for(int i = 0; i < tokens.size(); ++i) {
            // 判断当前字符串是否为操作符
            if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                // 获取栈顶的两个操作数
                int num1 = stk.top();
                stk.pop();
                int num2 = stk.top();
                stk.pop();
                
                // 根据操作符执行相应的计算
                if(tokens[i] == "+") 
                    stk.push(num2 + num1); // 加法
                else if(tokens[i] == "-") 
                    stk.push(num2 - num1); // 减法
                else if(tokens[i] == "*") 
                    stk.push(num2 * num1); // 乘法
                else 
                    stk.push(num2 / num1); // 除法
            }
            else {
                // 当前字符串是操作数,将其转换为整数后压入栈中
                stk.push(stoi(tokens[i]));
            }
        }
        
        // 最终栈顶的元素即为表达式的计算结果,返回该值
        return stk.top();
    }
};

代码流程总结

  1. 定义一个整数栈 stk 用于存储操作数。
  2. 遍历 tokens 中的每个字符串:
    • 如果当前字符串是操作符,弹出栈顶的两个操作数,进行相应的计算,将结果压入栈中。
    • 如果当前字符串是操作数,将其转换为整数并压入栈中。
  3. 遍历结束后,栈中剩下的唯一一个元素就是表达式的结果,返回这个值。

示例

  • 输入: tokens = ["2", "1", "+", "3", "*"]

    • 计算步骤:
      • 2 压栈
      • 1 压栈
      • + 取出 12,计算 2 + 1 = 3,结果 3 压栈
      • 3 压栈
      • * 取出 33,计算 3 * 3 = 9,结果 9 压栈
    • 输出: 9
  • 输入: tokens = ["4", "13", "5", "/", "+"]

    • 计算步骤:
      • 4 压栈
      • 13 压栈
      • 5 压栈
      • / 取出 513,计算 13 / 5 = 2,结果 2 压栈
      • + 取出 24,计算 4 + 2 = 6,结果 6 压栈
    • 输出: 6

标签:操作数,num1,压栈,stk,tokens,波兰,求值,表达式
From: https://blog.csdn.net/weixin_47151388/article/details/141725350

相关文章

  • Cron表达式
    Cron表达式是一种用于描述定时任务执行时间的字符串格式,在Unix、Linux、MacOSX等操作系统中被广泛使用。它通过一系列的时间字段来描述一个定时任务应该在哪些时间点执行。它通常由6~7位组成,年份可以省略。每个时间字段都可以是数字、星号、逗号、减号、正斜杠和问号这些特殊字......
  • M语言 01 - 表达式和值
    **“基元”**值是单个部分值,如数字、逻辑、文本或NULL。NULL值可用于指示缺少数据。123//Anumbertrue//Alogical"abc"//Atextnull//nullvalue“列表”值是值的有序序列。M支持无限列表,但如果作为文本写入,则列表具有固定长度。大括号字符{和}表示列......
  • Spring EL表达式使用详解
    SpringEL表达式使用详解什么是SpringEL表达式SpringEL表达式是Spring表达式语言,支持在xml和注解中使用表达式,类似于JSP的EL,JSTL表达式语言。Spring开发中我们会经常涉及到调用各种资源的情况,包含普通文件、网址、正则表达式、系统变量、其他Bean的一些属性、配置文件、集......
  • 从匿名内部类到Lambda表达式:Java编程的优雅进化
    匿名内部类首先我们先来介绍一下什么是匿名内部类匿名内部类:java中一种特殊的类定义方式,它允许你在需要实现一个接口或继承一个类的地方直接定义一个该接口或类的匿名子类。若想创建一个派生类的对象,并且对象只创建一次,可以设计为匿名内部类,可以大大简化代码注意:匿名内部类......
  • 解读代码检查规则语言CodeNavi的表达式节点和属性
    本文分享自华为云社区《CodeNavi中代码表达式的节点和节点属性》,作者:Uncle_Tom。1.前期回顾《寻找适合编写静态分析规则的语言》根据代码检查中的一些痛点,提出了希望寻找一种适合编写静态分析规则的语言。可以满足用户对代码检查不断增加的各种需求;使用户能够通过增加或减少对检......
  • 6 Python运算符和表达式
    本篇是Python系列教程第6篇,更多内容敬请访问我的Python专栏Python运算符和Java类似,但也有个别不同。Python表达式和Java的区别是Python表达式不用跟“;”结尾。1算术运算符算术运算符用于执行基本的数学运算,如加减乘除等。加法(+):将两个数相加。result......
  • 正则表达式:Visual Basic中的强大文本处理工具
    正则表达式:VisualBasic中的强大文本处理工具在软件开发中,文本处理是一项常见且关键的任务。正则表达式作为一种强大的文本模式匹配工具,能够用于执行各种复杂的字符串搜索、替换、验证等操作。VisualBasic(VB),作为一门流行的编程语言,提供了对正则表达式的支持。本文将详细介......
  • C# 正则表达式
    正则表达式是一种匹配输入文本的模式。.Net框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成。定义正则表达式下面列出了用于定义正则表达式的各种类别的字符、运算符和结构。字符转义字符类定位点分组构造限定符反向引用构造备......
  • QT学习笔记2(QPushButton类、对象树、信号与槽,Lambdabiao表达式)
    那些难过的日子,都一起陪伴,也不说些什么大道理。难过的时候,所有人都给你讲一堆大道理。只有你的好朋友,懂你的沉默,陪你一起在墙角蹲着。对象树QT中创建QObject对象会时,构造函数会接收一个Parent父对象指针作为参数。这就于相当于创建QObject对象时,可以提供一个父类,创建的Q......
  • 正则表达式(Regular Expression)
    正则表达式(RegularExpression)是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符"),可以用来描述和匹配字符串的特定模式,是一种用于模式匹配和搜索文本的工具,提供了一种灵活且强大的方式来查找、替换、验证和提取文本数据。概括:正则表达式是制定特定的......