C++-stack题型->最小栈,栈的压入与弹出,逆波兰表达式

news2024/11/29 20:54:38

目录

最小栈

栈的压入与弹出

 逆波兰表达式


最小栈

155. 最小栈 - 力扣(Leetcode)

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

刚刚开始,我认为可以写一个栈存放数据,一个int保存最小值,但是如果最小值在栈中呗pop时,我们就找不到之前的最小值了

 设计双栈解决该问题

mini栈的栈顶就是最小值存放栈数据中的。 当我们栈pop时只需要比较是否与mini.top()是否相等,相等mini.pop(),否则不动

如果多次压入多个0(最小值)我们也需要在mini栈压入0。否者在栈pop最小值时会把mini唯一最小值删除,但是pop的最小值是多个的,数据会出错。

栈.pop()。是把0删除,这次删除也会把mini栈0删除,删除后mini.top=2,而实际栈最小数据==0

 

所以我们需要在压入数据如果与mini.top相同或小于,mini.top也压入数据。

这样如果我们删除栈.pop(),此刻最小值依旧是0,而mini.top()也为0。

假设极端情况:最小值非常非常非常多,最小值1有100w个

 此时最小栈也要存放100w个1,极大的浪费了空间,所以我们使用计数器(一个结构体,里面保存最小值,以及最小值数量)

struct Intcount
{
    Intcount(int x = 0)
        :_val(x)
        , count(1)
    {}
    int _val;
    int count;
};

使用计数器代替了stack<int>-->stack<Intcount>

实现代码:

struct Intcount
{
    Intcount(int x = 0)
        :_val(x)
        , count(1)
    {}
    int _val;
    int count;
};

class MinStack {
private:    
    std::stack<Intcount> _minst;
    std::stack<int> st;
public:
    void push(int val) {
        if (_minst.size() == 0)
        {
            _minst.push(val);
            st.push(val);
        }
        else
        {
            st.push(val);
            if (st.top() == _minst.top()._val)
            {
                ++_minst.top().count;
            }
            else if(st.top() < _minst.top()._val)
            {
                _minst.push(val);
            }
        }
    }

    void pop() {
        if (st.top() == _minst.top()._val)
        {
            --_minst.top().count;
            if (_minst.top().count == 0)
            {
                _minst.pop();
            }
        }
        st.pop();
    }

    int top() {
        return st.top();
    }

    int getMin() {
        return _minst.top()._val;
    }
};

栈的压入与弹出

栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

1. 0<=pushV.length == popV.length <=1000

2. -1000<=pushV[i]<=1000

3. pushV 的所有数字均不相同

一句话,判断出栈顺序是否合法。

开辟一个栈

将popV与pushV的数据拿出来,将pushV的数据加载到栈中。

那栈顶的数据与popV的数据比较,如果相等就pop栈顶数据并且popV的下标++,无论相等不相等都要一直载入pushV数据

直到栈.top()等于popV[j]此刻将栈顶删除并且j++,并且检查新栈top是否等于popV[j         ] 

继续栈pop

 

 

这个时候检查栈是否有数据,如果有数据就是错误的,如果没有数据就是正确的。

代码:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        stack<int> st;
        vector<int>::size_type j=0;
        for(size_t i=0;i<pushV.size();++i)
        {
            st.push(pushV[i]);
            while(!st.empty()&&popV[j]==st.top())
            {
               st.pop();
               ++j;
            }
        }
        return st.empty();
    }
};

 逆波兰表达式

150. 逆波兰表达式求值 - 力扣(Leetcode)

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

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

注意:

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

建一个栈,将数字字符串转换为整型然后存放到栈中,如果遇见运算符字符串,就将栈中取两个数据,进行运行,结果在压入栈中。

注意我们将使用switch判断表达式,表达式不可能比对字符串,但是可以比对整型字符char。所以我们将运算符字符串在比较时取第一个元素比较  char*ch="+"  取ch[0]进行比较。

利用stoi函数将数字字符串转换为整型。

将“2”  和 “1”转换后压入栈中

 

 

 继续将字符串“5”压入栈中,

 

继续走遇见''*" 拿出数据5和3进行运算,5为右操作数,3为左操作数

++j走到末尾,此刻将栈.top取出的数据就是结果数据

 

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(auto ch : tokens)
        {
            if(ch=="+"||ch=="-"
             ||ch=="*"||ch=="/")
             {

                 int num2=st.top();
                 st.pop();
                 int num1=st.top();
                 st.pop();
                switch (ch[0]) {
                    case '+':
                        st.push(num1 + num2);
                        break;
                    case '-':
                        st.push(num1 - num2);
                        break;
                    case '*':
                        st.push(num1 * num2);
                        break;
                    case '/':
                        st.push(num1 / num2);
                        break;
                    }
             }
             else
             {
                 st.push(stoi(ch));
             }
    
        } 
    return st.top();
    }
};

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

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

相关文章

App 测试流程及资料合集

/1 / 测试理论知识:跟其他 web 等测试一样; /2 / 整体测试流程:同 web 类似 具体差异化见下方内容 /3 / App 独特测试点: 客户端兼容性测试:系统版本、不同深度定制的 rom、屏幕分辨率、中断测试、 安装、卸载、升级、对其他程序的干扰等 需要的一些工具: appnium / lr / …

测试工程师转型开发?还是继续磨练测试技能?

测试五年&#xff0c;没有积累编程脚本能力和自动化经验&#xff0c;找工作时都要求语言能力&#xff0c;自动化框架。 感觉开发同事积累的经历容易找工作。 下一步&#xff0c;想办法转开发岗还是继续测试&#xff1f;&#xff1f;&#xff1f; 正常情况下&#xff0c;有了四年…

pdf怎么在线阅读?一键查阅并不难

PDF格式的文件已经成为现代生活中不可或缺的一部分&#xff0c;无论是学术论文、电子书、工作文件还是表格&#xff0c;都有可能以PDF格式出现。然而&#xff0c;为了读取这些文件&#xff0c;我们需要安装PDF阅读器&#xff0c;这在某些情况下可能会带来不便。因此&#xff0c…

如何修复缺失的mfplat.dll文件,多种修复mfplat.dl分享

当你在使用电脑时&#xff0c;突然遇到了缺失了mfplat.dll的错误提示&#xff0c;你可能会感到非常烦恼。不要担心&#xff0c;这是一个常见的问题。在本文中&#xff0c;我们将指导你如何修复缺失的mfplat.dll文件。 一.什么是mfplat.dll MFPLAT.DLL是Microsoft Windows操作系…

广和通发布5G RedCap模组FG132-NA,助力5G商用规模化

5月30日&#xff0c;全球领先的无线通信模组和解决方案提供商广和通发布5G RedCap模组FG132-NA&#xff0c;加速5G技术在更多物联网场景广泛应用。 FG132-NA符合3GPP Release17演进标准&#xff0c;为物联网终端带来卓越5G体验的同时&#xff0c;全面优化产品尺寸、功耗以及成本…

spring boot与spring cloud版本兼容问题解决(附版本兼容表)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Matter】使用chip tool在ESP32-C3上进行matter开发

文章目录 使用chip tool在ESP32-C3上进行matter开发前提准备编译 chip-tool1.激活esp-matter环境2.编译matter所需环境3.构建CHIP TOOL chip-tool client 调试设备说明1.基于 BLE 调试2.通过IP与设备配对3.Trust store4.忘记当前委托的设备 使用chip-tool点灯1.matter环境激活2…

简单解决八皇后问题与n皇后问题

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 目录 一、问题描述 二、问题解决思路 1. 建立数据结构&#xff1a; 2. 约束条件的实现&#xff1a; 3. 结果展示&#xff1a; 4. 拓展至n皇…

(STL之string)string类的用法详解

string类成员函数PART1 成员函数(构造函数拷贝构造函数)&#xff1a;string 函数原型&#xff1a; string(); string (const string& str); string (const string& str, size_t pos, size_t len npos); string (const char* s); string (const char* s, size_t n)…

项目中使用es(一):使用springboot操作elasticsearch

使用springboot操作es 写在前面搭建项目环境和选择合适版本具体的代码实现&#xff08;1&#xff09;继承ProductInfoRepository具体的代码实现&#xff08;2&#xff09;使用ElasticsearchRestTemplate操作问题总结最后放个demo 写在前面 对于elasticsearch的搭建&#xff0c…

【Top10】天津高性价比Web前端培训机构(Web前端需要掌握什么技能)

Web前端开发已经成为了一门备受瞩目的技能&#xff0c;对于一些初学者或者转行的人来说&#xff0c;也是非常友好的&#xff0c;当然越火也越会存在争议&#xff0c;大部分没有经验的人会选择参加培训来学习Web前端技术&#xff0c;也有不少人对于参加Web前端培训的必要性存在疑…

项目管理系统的设计与实现(ASP.NET,SQL)

开发环境&#xff1a;Microsoft Visual Studio 数据库&#xff1a;Microsoft SQL Server 程序语言&#xff1a;asp.NET(C#)语言本系统的开发使各大公司所的项目管理更加方便快捷&#xff0c;同时也促使项目的管理变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。…

AIGC下的低代码赛道,你我皆是拓荒人

今年年初&#xff0c;ChatGPT的现象级爆发&#xff0c;让其底层技术AIGC的承载方OpenAI备受关注。几重buff叠加&#xff0c;打工人的命运可以说是跌宕起伏&#xff0c;命途多舛了。在国内&#xff0c;AIGC的长期价值已逐渐被挖掘&#xff0c;正在重构人们的办公、娱乐乃至生活方…

启真医学大模型

启真医学大模型 QiZhenGPT: An Open Source Chinese Medical Large Language Model 本项目利用启真医学知识库构建的中文医学指令数据集&#xff0c;并基于此在LLaMA-7B模型上进行指令精调&#xff0c;大幅提高了模型在中文医疗场景下效果&#xff0c;首先针对药品知识问答发…

事务隔离级别-浅析

事务隔离级别是指在并发操作下&#xff0c;不同的事务之间互相隔离的程度。常见的事务隔离级别有以下四种&#xff1a; 读未提交&#xff08;Read Uncommitted&#xff09;&#xff1a;一个事务可以读取另一个未提交事务的数据。这样可能会导致脏读、不可重复读和幻读等问题。…

是德KEYSIGHT N9918A、N9917A 手持式射频和微波组合分析仪

是德&#xff08;KEYSIGHT) N9917A,N9918A 手持式射频和微波组合分析仪 Keysight N9918A FieldFox 组合分析仪能够处理日常维护、深度故障排除以及介于两者之间的任何事情。Keysight N9918A (Agilent) FieldFox 可随时随地为您提供高质量测量。将 FieldFox N9918A 添加到您的故…

面试官:你来说一下分布式锁的设计与实现

今天跟大家探讨一下分布式锁的设计与实现。希望对大家有帮助&#xff0c;如果有不正确的地方&#xff0c;欢迎指出&#xff0c;一起学习&#xff0c;一起进步哈~ 分布式锁概述 数据库分布式锁 Redis分布式锁 Zookeeper分布式锁 三种分布式锁对比 1. 分布式锁概述 我们的…

低代码制造ERP管理系统:降低开发成本,提高生产效率

随着制造业的快速发展&#xff0c;ERP管理系统成为了现代制造业中不可或缺的一部分。ERP管理系统可以帮助企业更好地管理生产流程、库存和供应链等方面&#xff0c;从而提高企业的生产效率和竞争力。然而&#xff0c;传统的ERP管理系统往往需要大量的编程工作和长周期的开发过程…

Kali渗透Windows服务器

这个实验主要让我们学习漏洞扫描技术基本原理&#xff0c;了解其在网络攻防中的作用&#xff0c;掌握使用Kali中的Metasploit对目标主机渗透&#xff0c;并根据报告做出相应的防护措施。 本次实战环境&#xff1a;Kali渗透Windows服务器 实战步骤一 本实验通过利用kali进行漏…

【springcloud微服务】Spring Cloud Alibaba 整合dubbo与openfeign

一、前言 dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用&#xff0c;但使用过springcloud的同学大概了解到&#xff0c;springcloud生态的相关组件这些年已经逐步停更&#xff0c;这就导致在服务架构演进过程中的迭代断层&#xff0c;以至于一些新的技术组…