首页 > 其他分享 >逆波兰表达式求值——栈与队列

逆波兰表达式求值——栈与队列

时间:2024-11-18 22:41:16浏览次数:1  
标签:队列 s1 long tokens int str 求值 top 表达式

首先是第一次的代码

class Solution
{
public:
    int evalRPN(vector<string> &tokens)
    {
        stack<long long> str;
        for (int i = 0; i < tokens.size(); i++)
        {
            if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")
            {
                // 用于将字符串转换为 long long 类型的整数。
                str.push(stoll(tokens[i]));
            }
            else
            {
                // 没有办法直接把表达符放中间就一个一个if
                long long num1 = str.top();
                str.pop();
                long long num2 = str.top();
                str.pop();
                if (tokens[i] == "+")
                    str.push(num1 + num2);
                if (tokens[i] == "*")
                    str.push(num1 * num2);
                if (tokens[i] == "-")
                    str.push(num2 - num1);
                if (tokens[i] == "/")
                    str.push(num2 / num1);
            }
        }
        int sum = str.top();
        return sum;
    }
};

然后是第二次的代码

问题一在于 我该如何再不确定运算符的情况下进行计算——————就是一个一个if

问题二在于注意string和char的区别一个是双引号一个是单引号

问题三在于类型的对应问题 “no matching member function for call to 'push'” 这就是说明把string的类型传入了int 中需要进行类型的转换,又考虑到只有数字进去了所以只对数字进行转换即可。

但是stoll 是 C++ 中用于将字符串转换为 long long 类型整数的函数,所以这就意味着栈也必须是long long类型的

第二版代码逻辑正确但是有两个很细节的问题

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> s1; // 存放输入
        int size = tokens.size();
        for (int i = 0; i < size; i++) {
            if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" &&
                tokens[i] != "/") {
                s1.push(stoll(tokens[i]));
            } else {
                if (tokens[i] == "+") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a + b; // 我该如何再不确定运算符的情况下进行计算
                    s1.push(c);
                    continue;
                } else if (tokens[i] == "-") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a - b;
                    s1.push(c);
                    continue;
                } else if (tokens[i] == "*") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a * b;
                    s1.push(c);
                    continue;
                } else if (tokens[i] == "/") {
                    int a = s1.top();
                    s1.pop();
                    int b = s1.top();
                    s1.pop();
                    int c = a / b;
                    s1.push(c);
                    continue;
                }
            }
        }
        int result = s1.top();
        return result;
    }
};

细节一:外面都是long long类型 那么里面也应该是一样的,所以都需要改成了long long‘

细节二:就是运算顺序的问题,先出来的那个应该是在运算符的右边、

然后经过实验也不是说一定要转成long long 类型我们直接使用stoi把他们都转成int类型的也可以。

存储范围:

  • int:通常是 4 字节(32 位),它的取值范围是:
    • 有符号(signed)int-2^312^31 - 1,即大约 -21亿21亿
    • 无符号(unsigned)int02^32 - 1,即大约 042亿
  • long long:通常是 8 字节(64 位),它的取值范围是:
    • 有符号(signed)long long-2^632^63 - 1,即大约 -9.2 x 10^189.2 x 10^18
    • 无符号(unsigned)long long02^64 - 1,即大约 018.4 x 10^18

标签:队列,s1,long,tokens,int,str,求值,top,表达式
From: https://www.cnblogs.com/peishouhao/p/18553902

相关文章

  • MySQL进阶:深入索引 - 函数和表达式索引
    ......
  • 常用正则表达式
    目录#校验数字的表达式数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$正数、负数、和小数......
  • javascript-表达式与操作符
    1.数组初始化二维数组letmatrix=[[1,2,3],[4,5,6],[7,8,9]];未定义元素undefinedletsparseArray=[1,,,,5];包含三个未定义元素2.对象初始化letp={x:2.3,y:-1.2};点对象包含x,y坐标letq={};空对象q.x=2.3;q.y=-1.2;赋值3.函数letsquare=function(x){returnx*x;};......
  • cron表达式
    一、Cron表达式0/10****?这种表达式称为cron表达式,通过cron表达式可以灵活的定义出符合要求的程序执行的时间。Cron表达式支持到7个域。cron表达式分为7个域,之间使用空格分隔。其中最后一个域(年)可以为空,每个域都有自己允许的值和一些特殊字符构成。使用这些特殊字......
  • C# 表达式树 ---- 系列教程
    C#表达式树从0学习表达式树。作者:痴者工良地址:https://ex.whuanle.cn作者博客:http://www.whuanle.cn1.表达式树基础2.基础知识3.变量、常量、赋值4.五类运算符的表达5.判断语句6.循环控制7.值类型、引用类型、泛型、集合、调用函数  出处:C#表达式树......
  • 消息队列Kafka与RabbitMq异同分析
    消息模型:Kafka消息模型Topic和Partition:Topic:是消息的分类,所有相关的消息都被发送到同一个Topic。Partition:每个Topic可以有多个Partition,Partition是Topic的基本存储单元。Partition允许数据的并行处理,提高了吞吐量。消费者组:消费者可以组成一个消费者组(Co......
  • 消息队列的作用?
    先告诉你答案:异步、削峰、解耦。异步异步对应着同步,了解异步先了解什么是同步。同步:请求发送后,在收到结果之前一直等待。异步:请求发送后,可以去做其他事情。下面来看一个同步案例    用户发送请求之后,会一直等待,整个链路调用时间150ms+200ms+200ms=550ms。但是......
  • C++ lambda 表达式与「函数对象」(functor)
    C++lambda表达式与「函数对象」(functor)Created:2024-06-27T16:29+08:00Published:2024-11-17T17:01+08:00Categories:C-CPPfunctor(FunctionObject)首先要介绍的是functor——一个重载了operator()的类,该类的实例可以使用operator()。WhatareC++functorsand......
  • 删除字符串中的所有相邻重复项--栈与队列
    第一版的代码如下下:点击查看代码classSolution{public:stringremoveDuplicates(strings){stack<char>str;for(inti=0;i<s.size();i++){//要先判断才能进行压栈,再次记住栈一定要先判断是否为空i......
  • 正则表达式
    正则表达式:regularexpression,很多时候都简写为regex.正则表达式可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性.Java中,正则表达式是以字符串的形式体现的.程序示例:publicclassRegexDemo1{publicstaticvoidmain(String[]args){......