【stack题解】逆波兰表达式求值 | 用队列实现栈

news2025/1/11 13:58:47

逆波兰表达式求值

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

有效的算符为 '+'、'-'、'*' 和 '/' 。 每个操作数(运算对象)都可以是一个整数或者另一个表达式。 两个整数之间的除法总是 向零截断 。 表达式中不含除零运算。 输入是一个根据逆波兰表示法表示的算术表达式。 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:

输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。 逆波兰表达式主要有以下两个优点:

去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

分析

理解逆波兰表达式:

逆波兰表达式,是一种后缀表达式。

我们平时写的算式是这样的:1+10/5,这是一种中缀表达式,即运算符在中间,操作数在两边。

而中缀表达式并不适合计算机去计算,计算机是从左往右读取值的:1 + 10 / 5,这样计算的结果就是11/5=2。

为了贴合计算机的读取方式,我们就可以用后缀表达式,即操作数在前,相对顺序不变;运算符按照优先级的顺序,排列在后。

1+10/5改成后缀表达式为:1 10 5 / +

当从左往右读到 / 时,要把前两个操作数取出来运算,这种结构,让我们想到了

实现

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(auto str:tokens){
            if(str=="+"||str=="-"||str=="*"||str=="/"){
                int right=st.top();
                st.pop();
                int left=st.top();
                st.pop();
​
                switch(str[0]){
                    case '+':
                    st.push(left+right);
                    break;
                    case '-':
                    st.push(left-right);
                    break;
                    case '*':
                    st.push(left*right);
                    break;
                    case '/':
                    st.push(left/right);
                    break;
                }
            }
            else{
                st.push(stoi(str));
            }
        }
        return st.top();
    }
};

用队列实现栈

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。 int top() 返回栈顶元素。 boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:["MyStack", "push", "push", "top", "pop", "empty"]    
[[], [1], [2], [], [], []]
​
输出:[null, null, null, 2, 2, false]

解释:

MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

1 <= x <= 9 最多调用100 次 push、pop、top 和 empty 每次调用 pop 和 top 都保证栈不为空

进阶:你能否仅用一个队列来实现栈。

初级:用两个栈实现

两个栈q1、q2。当q1不为空,q2为空时,入数据就直接往q1入。删数据时,先把q1中不删的数据都入到q2中,再删q1的数。

class MyStack {
public:
    queue<int> q1,q2;
​
    MyStack() {
    }
    
    void push(int x) {
        if(!q1.empty()){
            q1.push(x);
        }
        else{
            q2.push(x);
        }
    }
    
    int pop() {     
        if(q1.empty()){
            int num=q2.size()-1;
            while(num--){
                q1.push(q2.front());
                q2.pop();
            }
            int ret=q2.front();
            q2.pop();
            return ret;
        }
        else{
            int num=q1.size()-1;
            while(num--){
                q2.push(q1.front());
                q1.pop();
            }
            int ret=q1.front();
            q1.pop();
            return ret;
        }
    }
    
    int top() {
        if(!q1.empty()){
            return q1.back();
        }
        else{
            return q2.back();
        }
    }
    
    bool empty() {
        return q1.empty()&&q2.empty();
    }
};

进阶:用一个栈实现

这个方法非常巧妙。我们就用一个队列,插入就直接入队列;删除的话,把 末尾元素之前的全部元素 出队,再重新入队,这样,队列的首元素就是栈顶元素了。此时再pop。

class MyStack {
public:
    queue<int> q;
    MyStack() {
​
    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int num=q.size()-1;  //把末尾元素之前的元素 都重新入队列
        while(num--){
            q.push(q.front());
            q.pop();
        }
        int ret=q.front();  //先记录栈顶元素,再删
        q.pop();
        return ret;
    }
    
    int top() {
        return q.back();
    }
    
    bool empty() {
        return q.empty();
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1202373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS1 学习11 坐标系tf 管理系统 简介及demo示例

坐标系是我们非常熟悉的一个概念&#xff0c;也是机器人学中的重要基础&#xff0c;在一个完整的机器人系统中&#xff0c;会存在很多坐标系&#xff0c;这些坐标系之间的位置关系该如何管理&#xff1f; ROS给我们提供了一个坐标系的管理神器——TF。 比如在机械臂形态的机器…

热敏电阻B值含义

1.B值&#xff08;材料常数&#xff09; 也称为β值&#xff0c;该热敏电阻规格是NTC热敏电阻的电阻与温度之间关系的特定曲线。它是一个描述热敏电阻材料物理特性的参数&#xff0c;也是热灵敏度指标&#xff0c;B值越大&#xff0c;表示热敏电阻器的灵敏度越高。应注意的是&a…

Python标准库中隐藏的利器

Python安装之后&#xff0c;其标准库中有的模块&#xff0c;不一定要通过代码来引用&#xff0c;还可以直接在命令行中使用的。 在命令行中直接使用Python标准库的模块&#xff0c;最大的好处就是就是不用写代码&#xff0c;就能使用其中的功能&#xff0c;当临时需要一些某些…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)

编辑员工和分类模块功能开发 1. 编辑员工1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 回显员工信息功能1.2.2 修改员工信息功能 1.3 功能测试 2. 分类模块功能开发2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码实现2.2.1 Mappe…

CSP模拟

1.3n -1 题目描述 给定一个整数n&#xff0c;只能对n进行以下这几种操作&#xff1a; 1.若n是3的倍数除以3 2.加1 3.减1 求最少多少次操作才能使n变为1&#xff1f; 输入 一行一个整数n 输出 一行一个整数表示答案 样例输入 4 样例输出 2 提示 对于样例1:4-…

亚马逊鲲鹏系统强大的指纹系统可有效防止账号关联

亚马逊鲲鹏系统最新的防指纹技术支持绑定不同的代理IP&#xff0c;可以根据ip创建不同的指纹环境&#xff0c;让账号伪装成来自不同地点、不同设备的流量&#xff0c;每个账号环境隔离开来&#xff0c;实现了完全独立的操作任务&#xff0c;避免了账户指纹关联和操作轨迹关联。…

搜集的升压芯片资料

DC-DC升压芯片,输入电压0.65v/1.5v/1.8v/2v/2.5v/2.7v/3v/3.3v/3.6v/5v/12v/24v航誉微 HUB628是一款超小封装高效率、直流升压稳压电路。输入电压范围可由低2V伏特到24伏特&#xff0c;升压可达28V可调&#xff0c;且内部集成极低RDS内阻100豪欧金属氧化物半导体场效应晶体管的…

桌面云架构讲解(VDI、IDV、VOI/TCI、RDS)

目录 云桌面架构 VDI 虚拟桌面基础架构 IDV 智能桌面虚拟化 VOI/TCI VOI 虚拟系统架构 TCI 透明计算机架构 RDS 远程桌面服务 不同厂商云桌面架构 桌面传输协议 什么是云桌面 桌面云是虚拟化技术成熟后发展起来的一种应用&#xff0c;桌面云通常也称为云桌面、VDI等 …

Swagger3 GET请求,使用对象接收 Query 参数,注解怎么写?

简中互联网上就没一个靠谱的答案&#xff0c;最终翻到了 Github Issue 上才解决&#xff0c;真 TMD…… CSDN 就一坨 shit mountain 解决方案 原文&#xff1a;https://github.com/swagger-api/swagger-core/issues/4177 太长不看&#xff1a; 请求方法参数上加 ParameterObj…

【异步并发编程】使用aiohttp构建Web应用程序

文章目录 1. 写在前面1. 什么是aiohttp&#xff1f;1.1. 什么是异步编程&#xff1f; 2. 安装aiohttp3. 异步HTTP服务器4. 异步请求5. aiohttp REST实例 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力…

行情不好,程序员的路在哪里?

最近有人提问&#xff0c;行情不好&#xff0c;程序员的路在哪里&#xff1f;今天的文章从远程工作、市场和流量思维、新技术、自媒体几个维度来讲讲。 远程工作 如果你在二三线城市&#xff0c;机会比较少&#xff0c;可以考虑一下远程工作。找一份美国或欧洲的远程工作&…

开源网安受邀参加网络空间安全合作与发展论坛,为软件开发安全建设献计献策

​11月10日&#xff0c;在广西南宁举办的“2023网络空间安全合作与发展论坛”圆满结束。论坛在中国兵工学会的指导下&#xff0c;以“凝聚网络空间安全学术智慧&#xff0c;赋能数字经济时代四链融合”为主题&#xff0c;邀请了多位专家及企业代表共探讨网络安全发展与数字经济…

助力燃气安全运行:智慧燃气管网背景延展

关键词&#xff1a;城市燃气管网、智慧燃气管网、智慧管网、智慧燃气管网解决方案、智慧燃气 01背景 当前&#xff0c;随着我国城市化进程不断加快&#xff0c;城市燃气管网也不断延伸&#xff0c;运行规模庞大&#xff0c;地下管线复杂&#xff0c;不少城市建设“重地上轻地…

Web后端开发_01

Web后端开发 请求响应 SpringBoot提供了一个非常核心的Servlet 》DispatcherServlet&#xff0c;DispatcherServlet实现了servlet中规范的接口 请求响应&#xff1a; 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据响应&#xff08;HttpServletRe…

2011年09月29日 Go生态洞察:image/draw包的深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

会展服务预约小程序的作用如何

不少场景都会有会展服务需求&#xff0c;比如婚宴、年会、展会等&#xff0c;往往需要租订场地&#xff0c;不同地域不同时间地点等&#xff0c;尤其大城市需求频次较高。 但在实际经营中&#xff0c;会员服务企业面临着一些难题。对多数企业来讲&#xff0c;线上是不可或缺的…

地面沉降监测站可以监测什么?

随着城市化的飞速发展&#xff0c;地面沉降问题日益凸显。为了及时掌握土地沉降情况&#xff0c;确保人们安全&#xff0c;就需要借助地面沉降监测站的力量。 一、实时监测土地沉降 地面沉降监测站的核心功能是实时监测土地沉降。通过高精度GNSS位移监测站和先进的数据分析技术…

使用Java实现一个简单的贪吃蛇小游戏

一. 准备工作 首先获取贪吃蛇小游戏所需要的头部、身体、食物以及贪吃蛇标题等图片。 然后&#xff0c;创建贪吃蛇游戏的Java项目命名为snake_game&#xff0c;并在这个项目里创建一个文件夹命名为images&#xff0c;将图片素材导入文件夹。 再在src文件下创建两个包&#xff0…

性能压测工具:Locust详解

一、Locust介绍 开源性能测试工具https://www.locust.io/&#xff0c;基于Python的性能压测工具&#xff0c;使用Python代码来定义用户行为&#xff0c;模拟百万计的并发用户访问。每个测试用户的行为由您定义&#xff0c;并且通过Web UI实时监控聚集过程。 压力发生器作为性…

在Android上使用Jetpack Compose定制下拉刷新

在Android上使用Jetpack Compose定制下拉刷新 在Jetpack Compose中向LazyList添加下拉刷新非常简单。说真的&#xff0c;只需几行代码。然而&#xff0c;默认的外观和感觉并不是那么令人满意。我们希望做得更好一些&#xff0c;类似于iOS版本&#xff1a;当用户向下拉动列表时…