【C++】栈和队列(stackqueue)介绍,实现,oj

news2024/10/7 12:28:31

🍅一文包教会,不再赘述栈最基本的结构和性质(栈的基本介绍在这里)

(队列基本介绍和实现),博主主页还有很多栈和队列oj题哦~

目录

☃️1.stack_list

 🐝1.1 介绍

🐝1.2 stack和list实现

🐝1.3 oj

☃️2.deque


 ☃️1.stack_list

🐝1.1介绍

首先明确 stack 不是容器,而是容器适配器,并且他的接口函数我们一看就懂

 并且发现栈没有迭代器,其实这也很正常,如果有迭代器那就可以随意访问,随意增删,不符合栈后进先出的性质

设计模式的概念:有点类似于兵法,很多人写了很多代码之后意识到什么场景有怎样的固定格式,从而形成了一种设计模式 

适配器模式:用现有的东西,封装转换出你想要的东西

迭代器模式:不暴露底层的细节,访问数据结时封装后用统一方式访问容器

 🐝1.2 stack和list实现

那么上面说过stack是一种适配器模式

所以我们可以考虑用vector或者list转换出stack

直接在模板里面加上一个参数表示你使用的是什么(vector/list)

list的实现也是一样的用两个参数写模板,不再赘述

 🐝1.3 oj

最小栈

首先分析一下,如果用一个变量记录最小元素,不能实时更新,万一最小元素被pop,无法找到第二小的元素,所以我们只需要用一个数据结构保存较小元素,最好就是stack,当保存最小元素的栈sortedStack为空,把要来的元素push,或者要来的元素小于sortedStack栈顶元素,也push,最后sortedStack栈顶的元素就是最小的,一旦最小元素被pop,我们同时把sortedStack栈顶pop,此时最新的栈顶就是次小元素啦,当然想用其他数据结构比如vector也是可以的,但是栈最好

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> dataStack;      // 数据栈
    stack<int> sortedStack;    // 有序栈(栈底最大,栈顶最小,有 <= 栈顶的元素才进行push)

    MinStack() 
    {}
    void push(int val) {
        dataStack.push(val);
        // --有序栈
        // ----如果为空 则 push
        // ----如果val 不大于 当前栈顶 则 push
        if(sortedStack.empty() || val <= sortedStack.top())
            sortedStack.push(val);
    }
    
    void pop() {
        // 数据栈的栈顶如果与 有序栈的栈顶相等, 那么都出栈
        if(dataStack.top() == sortedStack.top())
            sortedStack.pop();
        dataStack.pop();
    }
    
    int top() {
        return dataStack.top();
    }
    
    int getMin() {
        return sortedStack.top();
    }
};

 栈的压入、弹出序列

1.入栈序列入栈

2.判断 当 栈不是空&&栈顶元素==弹出序列当前元素(用一个下标i,每次执行1.i不变),删除栈顶元素,i++

3.判断最后i==弹出序列的size()

 

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

    }
};

逆 波兰表达式求值

区分中缀和后缀的区别 

 

题目里给了较为清楚的解释

tokens = ["4","13","5","/","+"]

对于这个用例,首先数字一直push到栈,一旦遇到运算符,栈顶元素作为操作符右侧数字,pop(),此时栈顶元素是操作符左侧数字,pop(),然后把远算结果push到栈

public:
    int evalRPN(vector<string>& tokens) {
    //首先写一个栈存储数据
    stack <int> st;
    for(auto e:tokens)
    {
       if(e=="*" || e=="+"||e=="-"||e=="/")
       {
        int num2=st.top();
         st.pop();
        int num1=st.top();
         st.pop();
         switch (e[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(e)); 
       }
    }
    return st.top();
    }
    
    };

☃️2.deque

他是一个双端队列,不需要满足先入先出,可以完美兼容,融合vector和list的缺点

 

 但是他还有缺点,并且实际上使用的不太多

缺点:

想在deque里面随机访问怎么搞?

算在第几个Buf里面然后再算在第几个,有一定的消耗但是没有vector快

一个Buf里插入还有一定的消耗,但是没有list快

优点:

但是做栈的默认容器很不错,做队列的默认容器也很好

什么情形比较好用?中间插入删除少,头尾插入删除多,偶尔下标随机访问

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

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

相关文章

人工智能|HCIA-AI V3.0(一)——人工智能概览

文章目录一 AI、机器学习、深度学习的关系二 AI的三个方面的应用2.1 计算机视觉2.2 语音处理2.3 自然语言处理三、争议四、未来展望一 AI、机器学习、深度学习的关系 人工智能:是研究、开发用于模拟、延伸和扩展人的智能的理论、方法及应用系统的一- 门新的技术科学。 机器学习…

【蓝桥杯集训15】求最短路存在负权边——spaf算法(3 / 4)

——SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称 单源最短路&#xff0c;且图中没有负环就可以用spfa 目录 spaf求最短路模板 852. spfa判断负环 341. 最优贸易 - spfa 双向建图 3305. 作物杂交 - spaf求最短路模板 只有当一个点的前驱结点更新了&#xff0c;…

多线程共享数据结构的无锁释放

目录背景问题共享结构的无锁释放对比ref-cntrcuepoch-based reclamhazard pointer: 冒险指针结构原理正确性保证范例参考背景 多线程共享一个数据结构。 共享数据结构&#xff0c;可以做到节约内存。 但是多线程共享&#xff0c;可能会有问题&#xff0c;比如同步的问题。 问…

(Android-RTC-9)PeerConnectionFactory

开篇前瞎扯。很久没发技术文章了&#xff0c;此文一直放着草稿箱没有完成&#xff0c;感觉自己在家庭和工作中找到了拖延的借口&#xff0c;开始慢慢变得懒惰了&#xff0c;那是万万不行的。恰逢2023开年ChatGPT的爆火&#xff0c;更让我这些普通程序员危机感瞬间飙升&#xff…

安全规约第一章

文章目录传统密码和现代密码的区别古典密码近代密码现代密码定义模型证明现代密码学CryptographyCryptanalysisCryptosystemScheme如何定义算法步骤第一步&#xff0c;搞清楚安全服务目标第二步&#xff0c;计算过程中需要几方的参与需要几个算法描述它算法命名谁来运行哪一个算…

03_Apache Pulsar的Local与分布式集群构建、Pulsar的分布式集群模式、Pulsar的分布式集群模式构建\启动\测试

1.3.Apache Pulsar的Local与分布式集群构建 1.3.1 Apache Pulsar的Local模式构建 1.3.1.1.Apache Pulsar的Local模式基本使用 1.3.2.Apache Pulsar的分布式集群模式 1.3.2.1.安装zookeeper集群 1.3.3.Apache Pulsar的分布式集群模式构建 1.3.4.Apache Pulsar的分布式集群模式启…

Sparx Systems Pro Cloud Server crack

Sparx Systems Pro Cloud Server crack 云服务器 添加了新的“OSLC会话超时”设置&#xff0c;以配置OSLC用户将注销的最长非活动时间。 改进了对重复SQL列名的处理。 FLS&#xff1a;为“组”添加了对其他Microsoft Active Directory名称格式的支持。 云配置客户端 在扩展服务…

香橙派5使用NPU加速yolov5的实时视频推理(二)

三、将best.onnx转为RKNN格式 这一步就需要我们进入到Ubuntu20.04系统中了&#xff0c;我的Ubuntu系统中已经下载好了anaconda&#xff0c;使用anaconda的好处就是可以方便的安装一些库&#xff0c;而且还可以利用conda来配置虚拟环境&#xff0c;做到环境与环境之间相互独立。…

SpringCloud Alibaba入门

作为微服务刚入门的小白&#xff0c;不足之处请多多指教 1. Cloud Alibaba简介2.Nacos简介和下载3.Nacos安装4.Nacos之服务提供者注册5.Nacos之服务消费者注册和负载6.Nacos服务注册中心对比提升7.Nacos之服务配置中心8.Nacos之命名空间分组和DataID三者关系9.Nacos之DataID配…

如何写好单测

1、为什么要写单测&#xff1f; 单测即单元测试&#xff08;Unit Test&#xff09;&#xff0c;是对软件的基本组成单元进行的测试&#xff0c;比如函数、过程或者类的方法。其意义是&#xff1a; 功能自测&#xff0c;发现功能缺陷自我Code Review测试驱动开发促进代码重构并…

File、递归、IO流(一)、IO流(二)

目录 ​File类概述 File类的常用API 判断文件类型、获取文件信息 创建文件、删除文件功能 遍历文件夹 方法递归 递归的形式和特点 递归的算法流程、核心要素 递归常见案例 递归的经典问题 非规律化递归案例-文件搜索 非规律化递归案例-啤酒问题 字符集 常见字符集…

美团二面经历——如何设计一个百万人抽奖系统?

文章目录 导图V0——单体架构V1——负载均衡V2——服务限流防止用户重复抽奖拦截无效流量服务降级和服务熔断V3 同步状态V4线程优化V5业务逻辑V6流量削峰通用思路单一职责URL动态加密静态资源——CDN服务限流数据预热削峰填谷导图 导图按照由浅入深的方式进行讲解,架构从来不是…

西电计算机组成原理(计组)核心考点汇总(期末真题+核心考点)

文章目录前言一、真题概览1.1 计组1历年真题1.2 计组2历年真题二、知识点说明2.1 计组12.1.1 冯诺依曼计算机组成和特点2.1.2 复杂指令系统计算机和特点2.1.3 精简指令系统计算机的特点2.1.4 指令长度的影响因素2.1.5 控制器2.1.6 微指令特性2.2 计组22.2.1 SMP特点与优点2.2.2…

QML动态对象管理

QML中有多种方式来动态创建和管理QML对象&#xff1a; Loader &#xff08;加载器&#xff09;Repeater&#xff08;复制器&#xff09;ListView&#xff0c;GridWiew&#xff0c;PethView&#xff08;视图&#xff09; &#xff08;之后会介绍&#xff09;使用加载器&#xff…

剖析G1 垃圾回收器

简单回顾 在Java当中&#xff0c;程序员在编写代码的时候只需要创建对象&#xff0c;从来不需要考虑将对象进行释放&#xff0c;这是因为Java中对象的垃圾回收全部由JVM替你完成了(所有的岁月静好都不过是有人替你负重前行)。 而JVM的垃圾回收由垃圾回收器来负责&#xff0c;在…

刷题记录:牛客NC200179Colorful Tree 奇奇怪怪的dfs序

传送门:牛客 题目描述: A tree structure with some colors associated with its vertices and a sequence of commands on it are given. A command is either an update operation or a query on the tree. Each of the update operations changes the color of a specifi…

论文阅读 - End-to-End Wireframe Parsing

文章目录1 概述2 L-CNN2.1 整体架构2.2 backbone2.3 juction proposal module2.4 line sample module2.5 line verificatoin module3 评价指标参考资料1 概述 本文是ICCV2019的一篇论文&#xff0c;核心是提出了一种简单的end-to-end的two-stage的检测图像中线段的方法。同时&…

192、【动态规划】leetcode ——64. 最小路径和:回溯法+动态规划(C++版本)

题目描述 原题链接&#xff1a;64. 最小路径和 解题思路 &#xff08;1&#xff09;回溯法 分别向右或下进行探查 class Solution { public:int res INT_MAX;void backtracking(vector<vector<int>>& grid, int x, int y, int pathSum) {// 超出边界&…

高可用 - 08 Keepalived集群中Master和Backup角色选举策略

文章目录概述实例说明“weight”值为正数“weight”值为负数总结概述 在Keepalived集群中&#xff0c;其实并没有严格意义上的主、备节点&#xff0c;虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态&#xff0c;但是这并不意味着此节点一直就是Master角色。…

Python实现人脸识别,进行视频跟踪打码,羞羞的画面统统打上马赛克

哈喽兄弟们&#xff0c;我是轻松~ 今天我们来实现用Python自动对视频打马赛克前言准备工作代码实战效果展示最后前言 事情是这样的&#xff0c;昨天去表弟家&#xff0c;用了下他的电脑&#xff0c;不小心点到了他硬盘里隐藏的秘密&#xff0c;本来我只需要用几分钟电脑的&…