栈 、队列

1.stack的介绍和使用

  1.1stack的介绍

  stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

  1.2 stack的使用

函数说明

接口说明

stack()

构造空的栈

empty()

检测stack是否为空

size()

返回stack中元素的个数

top()

返回栈顶元素的引用

push()

将元素val压入stack中

pop()

将stack中尾部的元素弹出

 

1.2.1题目带入

最小栈

思路分析:通过建立两个栈一个输入数据的站,一个最小栈,当最小栈的数据为空时将插入数据于栈顶或者输入数据栈中的数据小于最小栈栈顶的数据,则将更新最小数据插入栈顶。当pop数据时,要考虑输入栈的数据是否是最小栈的数据,如果是将一并pop.

class MinStack
{
public: 
   void push(int x)
   { 
     // 只要是压栈,先将元素保存到_elem中 _elem.push(x); 
     // 如果x小于_min中栈顶的元素,将x再压入_min中 
     if(_min.empty() || x <= _min.top()) _min.push(x); 
    } 
    void pop()
     {
       // 如果_min栈顶的元素等于出栈的元素,_min顶的元素要移除 
       if(_min.top() == _elem.top()) _min.pop(); 
       _elem.pop();
     }
     int top()
     {
       return _elem.top();
     } 
     int getMin()
    {
      return _min.top();
     }
private:
     // 保存栈中的元素
     std::stack<int> _elem;
   
     // 保存栈的最小值
     std::stack<int> _min;
};

栈的压入、弹出序列

思路分析:判断两个是否是弹出序列关系,则判断是否符合返回的标准,及将第一个数组压入另一个数组,如果不同就查看是否是因为数组数据未全部进栈,如果不是就可以确定没有关系,如果成功配对就结束循环【成功】。

class Solution {
public:
 bool IsPopOrder(vector<int> pushV,vector<int> popV) {
  //入栈和出栈的元素个数必须相同
  if(pushV.size() != popV.size()) 
  return false;
 
  // 用s来模拟入栈与出栈的过程 
  int outIdx = 0; 
  int inIdx = 0; stack<int> s; 
  while(outIdx < popV.size())
  {
   // 如果s是空,或者栈顶元素与出栈的元素不相等,就入栈 
   while(s.empty() || s.top() != popV[outIdx]) 
   {
    if(inIdx < pushV.size()) 
      s.push(pushV[inIdx++]); 
    else 
      return false; 
   }
   // 栈顶元素与出栈的元素相等,出栈 s.pop(); outIdx++; } 
   return true;
 }
};

1.2.2satck模拟内核调用
#include<iostream>
#include<vector>
#include<deque>

namespace bite
{
    template <class T,class _com=std::deque<T>>
    class stack
    {
        public:
        stack()
        {

        }
        void push(const T& date)
        {
            m_stack.push_bake(date);
            size++;
        }
        size_t size()
        {
          return m_stack.size();  
        }
        T& top()
        {
            return m_stack[size-1];
        }
        const T& top()const{
            return m_stack[size-1];
        }
        void pop()
        {
            m_stack.pop_back();
            
        }
        bool empty()
        {
            return size==0;
        }
        private:
         _com m_stack;
    }; 
}

2.queue的介绍和使用

2.1.queue介绍

1.1队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。

2.2. queue的使用

函数声明

接口说明

queue()

构造空的队列

empty()

检测队列是否为空,是返回true,否则返回false

size()

返回队列中有效元素的个数

front() 

返回队头元素的引用

back()

返回队尾元素的引用

push()

在队尾将元素val入队列

pop()

将队头元素出队列

queue模拟
#include<iostream>
#include<deque>

namespace bite
{
    template <class T,class _com=std::deque<T>>
    class queue
    {
        public:
        queue()
        {

        }
        void push(const T& date)
        {
            m_stack.push_back(date);
        }
        size_t size()
        {
          return m_stack.size();  
        }
        T& top()
        {
            return m_stack[size()-1];
        }
        const T& top()const{
            return m_stack[size()-1];
        }
        void pop()
        {
            m_stack.pop_back();
            
        }
        bool empty()
        {
            return size==0;
        }
        private:
         _com m_stack;
    }; 

3.priority_queue的介绍和使用

3.1的介绍

  1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
  2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。

3.2 priority_queue的使用

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。

函数声明

接口说明

priority_queue()/priority_queue(first,last)

构造一个空的优先级队列

empty( )

检测优先级队列是否为空,是返回true,否则返回false

top( )

返回优先级队列中最大(最小元素),即堆顶元素

push(x)

在优先级队列中插入元素x

pop()

删除优先级队列中最大(最小)元素,即堆顶元素

3.3 在OJ中的使用

数组中的第K个最大元素

class Solution {
public:
 int findKthLargest(vector<int>& nums, int k) {
 // 将数组中的元素先放入优先级队列中
 priority_queue<int> p(nums.begin(), nums.end());
 
 // 将优先级队列中前k-1个元素删除掉 for(int i= 0; i < k-1; ++i) {
 p.pop();
 }
 
 return p.top();
 }
};

3.4伪函数(伪函数对象)

在模板元编程中,有时会使用类或结构来模拟函数的行为,这些类或结构通常包含一个或多个模板特化的操作符重载,以模仿函数调用的语法。这些类或结构可以被视为“伪函数对象”,因为它们看起来像是函数,但实际上是通过对象来调用的。

template <typename T>  
struct add {  
    T operator()(T a, T b) const {  
        return a + b;  
    }  
};  
  
int main() {  
    add<int> adder;  
    int result = adder(3, 4); // 调用伪函数对象  
    return 0;  
}

模拟priority_queue
#include<iostream>
#include<deque>
namespace bite
{
    //伪函数
    //仿函数中的成员函数不能在本类中重载,需要重载的再写一个类。
    template<class T>
    class less
    {
    public:
       bool operator()(const T& x, const T& y)
        {
            return x < y;
        }
    };
    template<class T>
    class head
    {
    public:
        bool operator()(const T lhs,const T  rhs)
       {
           return lhs<rhs;
       }
       bool operator()(const T*lhs,const T* rhs)
       {
           return *lhs<*rhs;
       }
    };
    template<class T,class C>
    class gred
    {
      bool operator()(const T*lhs,const T* rhs)
       {
           return *lhs<*rhs;
       }
    };
    template <class T,class _com=std::deque<T>,class _com2=less<T>>
    class priority_queue
    {
        public:
        priority_queue()
        {

        }
        void quequ(size_t n)
        {
            _com2 com;
            size_t nin=n*2+1;
            while(nin<m_stack.size())
            {
                if(com(nin+1,m_stack.size())&&com(m_stack[nin],m_stack[nin+1]))
                {
                    nin+=1;
                }
                if(com(m_stack[n],m_stack[nin]))
                {
                    std::swap(m_stack[nin],m_stack[n]);
                    n=nin;
                    nin=n*2+1;
                }
                else
                {
                    break;
                }
            }
        }
        void kuequeu()
        {  int i=m_stack.size()-1;
           for(;i>=0;i--)
           quequ(i);
        }
        void push(const T& date)
        {
            m_stack.push_back(date);
            kuequeu();
           
        }
        size_t size()
        {
          return m_stack.size();  
        }
        T& top()
        {
            return m_stack[0];
        }
        const T& top()const{
            return m_stack[0];
        }
        void pop()
        {
            std::swap(m_stack[0],m_stack[m_stack.size()-1]);
            m_stack.pop_back();
           quequ(0);
          
        }
        bool empty()
        {
            return size==0;
        }
        private:
         _com m_stack;
    };

4.容器适配器

4.1 什么是适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。

4.2 STL标准库中stack和queue的底层结构

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque,比如:

4.3 deque的简单介绍(了解)

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:

那deque是如何借助其迭代器维护其假想连续的结构呢?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Opencv | 边缘检测 轮廓信息

目录 一. 边缘检测1. 边缘的定义2. Sobel算子 边缘提取3. Scharr算子 边缘提取4. Laplacian算子 边缘提取5. Canny 边缘检测算法5.1 计算梯度的强度及方向5.2 非极大值抑制5.3 双阈值检测5.4 抑制孤立弱边缘 二. 轮廓信息1. 获取轮廓信息2. 画轮廓 一. 边缘检测 1. 边缘的定义…

【QT】Ubuntu22.04 配置 QT6.5 LTS

【QT】Ubuntu22.04 配置 QT6.5 LTS 文章目录 【QT】Ubuntu22.04 配置 QT6.5 LTS1.注册QT Group的账号2.安装QT Creator3.启动QT Creator报错from 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin.4.运行QT的demoReference 1.注册QT Group的…

mysql buffer pool详解

介绍 缓冲池是InnoDB在访问表和索引数据时缓存的主内存区域。缓冲池允许直接从内存访问频繁使用的数据&#xff0c;这加快了处理速度。在专用服务器上&#xff0c;通常会将多达80%的物理内存分配给缓冲池。 为了提高大容量读操作的效率&#xff0c;缓冲池被划分为可能包含多行…

类与对象(三) 拷贝构造与赋值运算符重载

目录 1.拷贝构造 2.运算符重载&#xff08;日期类举例&#xff09; 1. 2.和 3. > > < < 4.赋值运算符重载 5.- 与- 6. -- 7.日期 - 日期 3.const成员函数 4.<<和>>重载 5.取地址重载 1.拷贝构造 拷贝构造也是一个构造函数。我们前…

Linux:动静态库介绍

动静态库 库的介绍开发环境 & 编译器库存在的意义库的实现库的命名静态库制作和使用总结 动态库的制作和使用动态库的使用方法方法一方法二方法三 库加载问题静态库加载问题动态库的加载问题与位置无关码 C/C静态库下载方式 库的介绍 静态库&#xff1a;程序在编译链接的时…

C++初识--------带你从不同的角度理解引用的巧妙之处

1.对于展开的理解 我们这里的展开包括命名空间的展开和头文件的展开&#xff0c;两者的含义是不一样的&#xff1a; 头文件的展开就是把头文件拷贝到当前的文件里面&#xff1b; 命名空间的展开不是拷贝&#xff0c;而是因为编译器本身默认是到全局里面去找&#xff0c;当我…

一些常见的Windows命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言看版本号查找端口启动程序杀死某个端口查看全部端口看ip进入目录就是总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#x…

Linux——匿名管道

为什么要有进程间通信&#xff1f; 在操作系统中&#xff0c;进程是独立运行的程序&#xff0c;多个进程之间要想互相协作完成任务&#xff0c;就需要进程间通信。 什么是进程间通信&#xff1f; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#…

03-JAVA设计模式-解析器模式

解释器模式 什么是解析器模式 在Java中&#xff0c;解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子…

六、e2studio VS STM32CubeIDE之代码自动补全

目录 一、概述/目的 二、eclipse c/c自动补全 2.1 修改实现原理 2.2 修改插件cdt.ui的方法 2.2.1 资料来源 2.2.2 修改的主要流程或逻辑 2.2.3 失败的原因 三、呼吁st和Renesas厂家支持自动补全代码 六、e2studio VS STM32CubeIDE之代码自动补全 一、概述/目的 eclipse…

解决:前端bootstrap的fileInput插件

项目场景&#xff1a; 帮朋友做一个后台管理系统遇到文件上传回显异常的问题。 项目是单体架构&#xff0c;没有前后端分离&#xff0c;前端使用的bootstrap3Thymeleaf。上传插件用的是fileInput。 问题描述&#xff1a; 上传没有问题&#xff0c;完成后点击编辑再次进入无…

从本地创建项目到 Gitee 提交的完整教程

1、本地创建一个新项目 2.进入想上传的项目的文件夹&#xff0c;然后右键点击git bash 3.初始化本地环境&#xff0c;把该项目变成可被git管理的仓库 4.添加该项目下的所有文件到暂存区 5.使用如下命令将文件添加到仓库中去 6.在gitee上创建以自己项目名称命名的空项目 7.将本地…

springboot结合elasticJob

先说一说什么是elasticJob。 ElasticJob是一个分布式任务调度的解决方案&#xff0c;它由俩个相互独立的子项目Elastic-job-lite和Elastic- job-cloud组成。 任务调度&#xff1a;是指系统为了自动完成特定任务&#xff0c;在任务的特定时刻去执行任务的过程。 分布式&#xf…

窗函数的选择

不同的窗函数实质上时对矩形窗进行了不同程度的加权得到的不同类型的窗函数。 将模拟角频率转换为了数字角频率 矩形窗旁瓣过大&#xff0c;两个频率的峰值相差较大&#xff0c;因此无法识别&#xff0c;可以使用旁瓣非常小的窗函数来进行分辨&#xff0c;只是想要达到相同的分…

(C++) this_thread 函数介绍

文章目录 &#x1f6a9;前言⭐std::this_thread&#x1f579;️get_id()&#x1f5a5;️Code&#x1f516;get_id介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep_for<>()&#x1f5a5;️Code&#x1f516;sleep_for介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep…

python基础语法--列表

一、列表的概念 列表&#xff08;List&#xff09;是一种有序、可变、允许重复元素的数据结构。列表用于存储一组相关的元素&#xff0c;并且可以根据需要动态地进行增加、删除、修改和访问。以下是列表的主要特点和操作&#xff1a; 有序性&#xff1a; 列表中的元素是按照它…

最新AI创作系统ChatGPT网站源码Midjourney-AI绘画系统,Suno-v3-AI音乐生成大模型。

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

【CVPR2024】文本到图像的行人再识别中的噪声对应学习

这篇论文的标题是《Noisy-Correspondence Learning for Text-to-Image Person Re-identification》,作者是来自中国四川大学、英国诺森比亚大学、新加坡A*STAR前沿人工智能研究中心和高性能计算研究所的研究人员。论文主要研究了文本到图像的行人再识别(Text-to-Image Person…

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

Windows抛弃历史包袱:可能带来哪些改善?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Windows的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;性能提升固然重要&#xff0…