C++ 学习系列 -- std::stack 与 std::queue

news2024/12/23 12:24:57

一  std::stack 与 std::queue 分别是什么?

 两者均是 c++ 中的序列化容器,区别在于:

 std::stack   元素是先进后出

 std::queue 元素是先进先出

二  std::stack 与 std::queue 原理

1 std:statck

2. std::queue

两者底层容器可以是 list 也可以是 deque ;

为了保证 两个序列式容器的特点, 两者均不支持遍历,也不支持迭代器。

三  常见函数接口与使用

1.  std::stack

1.1 构造函数

std::stack<T,Container>::stack - cppreference.com

函数说明
stack()空构造函数

1.2  容器修改

              

函数说明
push在栈顶 放入元素
emplace在栈顶 放入元素,也可以放入元素类的参数,实现原地构造
pop弹出栈顶元素

1.3 容器访问

函数说明
top返回栈顶元素的引用

1.4 容器空间

函数说明
empty判断栈是否为空
size返回栈中元素个数

代码如下:

#include<iostream>
#include<stack>


int main()
{

   // 1. constructor
    std::stack<int> tmp_stack;
    
    
    // 2. Modifiers
    tmp_stack.push(1);
    tmp_stack.push(2);
    tmp_stack.push(3);
    tmp_stack.push(3);
    
    tmp_stack.pop();    
    
    tmp_stack.emplace(4);
    tmp_stack.emplace(5);
    
    
    // 3. Element access
    
    std::cout << tmp_stack.top() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_stack.empty() << std::endl;
    std::cout << tmp_stack.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_stack.empty()) {
        std::cout << tmp_stack.top() << " ";
        tmp_stack.pop();
    }
    return 0;
}

2. std::queue

1.1 构造函数

   https://en.cppreference.com/w/cpp/container/queue/queue

函数说明
queue空构造函数

1.2  容器修改

函数说明
push在队尾放入元素
emplace在队尾 放入元素,也可以放入元素类的参数,实现原地构造
pop弹出队首元素

1.3 容器访问

函数说明
front返回队首元素的引用
back返回队尾元素的引用

1.4 容器空间

函数说明
empty判断queue 是否为空
size返回queue中元素个数

   代码:

  

#include<iostream>
#include<queue>

int main()
{
     // 1. constructor
    std::queue<int> tmp_queue;

    // 2. Modifiers
    tmp_queue.push(1);
    tmp_queue.push(2);
    tmp_queue.push(3);
    tmp_queue.push(3);

    tmp_queue.pop();

    tmp_queue.emplace(4);
    tmp_queue.emplace(5);


    // 3. Element access

    std::cout << tmp_queue.front() << std::endl;
    std::cout << tmp_queue.back() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_queue.empty() << std::endl;
    std::cout << tmp_queue.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_queue.empty()) {
        std::cout << tmp_queue.front() << " ";
        tmp_queue.pop();
    }

  输出:

   

四  简单实现

下面代码中的 my_deque.h 为 这个博客中实现的 my_deque

C++ -- 学习系列 std::deque 的原理与使用-CSDN博客

1. my_stack

// my_stack.h

#include"my_deque.h"

template<typename T>
class my_stack
{
public:
    my_stack()
    {

    }
    ~my_stack()
    {

    }

    void push(T& val)
    {
        data.push_back(val);
    }

    void push(T&& val)
    {
        data.push_back(val);
    }

    T& top()
    {
        return data.back();
    }

    void pop()
    {
        data.pop_back();
    }

    int size()
    {
        return data.size();
    }

    bool empty()
    {
        return data.empty();
    }

private:
    my_deque<T, 16> data;

};
// main.cpp
int main()
{
    // 1. constructor
    std::stack<int> tmp_stack;


    // 2. Modifiers
    tmp_stack.push(1);
    tmp_stack.push(2);
    tmp_stack.push(3);
    tmp_stack.push(3);

    tmp_stack.pop();

    tmp_stack.emplace(4);
    tmp_stack.emplace(5);


    // 3. Element access

    std::cout << tmp_stack.top() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_stack.empty() << std::endl;
    std::cout << tmp_stack.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_stack.empty()) {
        std::cout << tmp_stack.top() << " ";
        tmp_stack.pop();
    }

    return 0;
}

输出:

  

2. my_queue

// my_queue.h

#include"my_deque.h"

template<typename T>
class my_queue
{
public:
    my_queue()
    {

    }
    ~my_queue()
    {

    }

    void push(T& val)
    {
        data.push_back(val);
    }

    void push(T&& val)
    {
        data.push_back(val);
    }
    void pop()
    {
        data.pop_front();
    }

    T& front()
    {
        return data.front();
    }

    T& back()
    {
        return data.back();
    }

    bool empty()
    {
        return data.empty();
    }

    int size()
    {
        return data.size();
    }

private:
    my_deque<T, 16>  data;

};


// main.cpp

int main()
{
    // 1. constructor
    my_queue<int> tmp_queue;


    // 2. Modifiers
    tmp_queue.push(1);
    tmp_queue.push(2);
    tmp_queue.push(3);
    tmp_queue.push(3);

    tmp_queue.pop();


    // 3. Element access

    std::cout << tmp_queue.front() << std::endl;
    std::cout << tmp_queue.back() << std::endl;
    std::cout << "------" << std::endl;

    // 4. Capacity

    std::cout << tmp_queue.empty() << std::endl;
    std::cout << tmp_queue.size() << std::endl;
    std::cout << "------" << std::endl;

    while (!tmp_queue.empty()) {
        std::cout << tmp_queue.front() << " ";
        tmp_queue.pop();
    }

    return 0;
}

 输出:

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

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

相关文章

创建型设计模式 单例 工厂模式 看这一篇就够了

4&#xff0c;创建型模式 创建型模式的主要关注点是“怎样创建对象&#xff1f;”&#xff0c;它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度&#xff0c;使用者不需要关注对象的创建细节。 创建型模式分为&#xff1a; 单例模式工厂方法模式抽象工程模…

vue3简易文字验证码

大神勿喷&#xff0c;简易版本&#xff0c;demo中可以用一下。 需要几个文字自己codelen 赋值 灵活点直接父组件传过去&#xff0c;可以自己改造 首先创建一个生成数字的js **mathcode.js**function MathCode(num){let str "寻寻觅觅冷冷清清凄凄惨惨戚戚乍暖还寒时候…

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…

object-fit,object-position让img标签表现得像背景图那样能自适应和调整显示位置

文章目录 一、object-fit的用法二、object-position的用法 图片在网页中有2种表现形式&#xff0c;使用CSS的background-image或者HTML的img标签来实现。 背景图实现如notion的封面图效果可以使用background-position或者background-size轻松实现&#xff0c;首先来看看notion…

2023年安全员-C证证模拟考试题库及安全员-C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年安全员-C证证模拟考试题库及安全员-C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;安全员-C证证模拟考试题库是根据安全员-C证最新版教材&#xff0c;安全员-C证大纲整理而成&#xff08;含2023年…

【Java 进阶篇】JDBC Statement:执行 SQL 语句的重要接口

在Java应用程序中&#xff0c;与数据库进行交互是一项常见的任务。为了执行数据库操作&#xff0c;我们需要使用JDBC&#xff08;Java Database Connectivity&#xff09;来建立与数据库的连接并执行SQL语句。Statement接口是JDBC中的一个重要接口&#xff0c;它用于执行SQL语句…

leetCode 376.摆动序列 贪心算法

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…

AI智能问答系统源码/AI绘画商业系统/支持GPT联网提问/支持Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图…

.360、.halo勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言&#xff1a; 在网络犯罪的阴影下&#xff0c;.360和.halo勒索病毒显得格外神秘而危险&#xff0c;它们都属于BeijingCrypt勒索病毒家族旗下的病毒&#xff0c;两者加密特征一致&#xff0c;加密勒索信内容一致。本文91数据恢复将深度解析.360、.halo勒索病毒的内部机制&a…

【算法速查】一篇文章带你快速入门八大排序(上)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;首先在这里祝大家中秋国庆双节同乐&#xff01;&#xff01;今天用一篇文章为大家把八大排序算法都过一遍&#xff0c;当然由于篇幅的原因不是每…

华为云云耀云服务器L实例评测|Ubuntu系统MySQL 8.1.0 Innovation压测

文章目录 前言&#x1f4e3; 1.前言概述&#x1f4e3; 2.云服务器性能监控&#x1f4e3; 3.MySQL8.1版本安装✨ 3.1 安装包下载✨ 3.2 解压安装包✨ 3.3 登录验证 &#x1f4e3; 4.ubuntu安装sysbench&#x1f4e3; 5.云服务器压测✨ 5.1 IO测试✨ 5.2 CPU性能测试 &#x1f4e…

React18+Ts项目配置husky、eslint、pretttier、commitLint

前言 我的项目版本如下&#xff1a; React&#xff1a; V18.2.0Node.js: V16.14.0TypeScript&#xff1a;最新版工具&#xff1a; VsCode 本文将采用图文详解的方式&#xff0c;手把手带你快速完成在React项目中配置husky、prettier、commitLint&#xff0c;实现编码规范的统…

Javaweb作业小结

简单的XML文档 用JS求连乘积 function product(N) { let p 1; for (let i 1; i < N; i) { p * 2 * i - 1; } return p; } // 调用函数并输出结果 const N 7; // 这里的 N 是你想要的奇数的个数 const result product(N); console.log(p ${result}); Servlet映射关系…

动态规划:两个数组的dp问题(C++)

动态规划&#xff1a;两个数组的dp问题 前言两个数组的dp问题1.最长公共子序列&#xff08;中等&#xff09;2.不同的子序列&#xff08;困难&#xff09;3.通配符匹配&#xff08;困难&#xff09;4.正则表达式&#xff08;困难&#xff09;5.交错字符串&#xff08;中等&…

Go结构体深度探索:从基础到应用

在Go语言中&#xff0c;结构体是核心的数据组织工具&#xff0c;提供了灵活的手段来处理复杂数据。本文深入探讨了结构体的定义、类型、字面量表示和使用方法&#xff0c;旨在为读者呈现Go结构体的全面视角。通过结构体&#xff0c;开发者可以实现更加模块化、高效的代码设计。…

背包问题

目录 开端 01背包问题 AcWing 01背包问题 Luogu P2925干草出售 Luogu P1048采药 完全背包问题 AcWing 完全背包问题 Luogu P1853投资的最大效益 多重背包问题 AcWing 多重背包问题 I AcWing 多重背包问题 II Luogu P1776宝物筛选 混合背包问题 AcWing 混合背包问题…

JavaSE学习之--抽象类和接口

&#x1f495;"没有眼泪我们就会迷路&#xff0c;彻底变成石头&#xff0c;我们的心会变成冰凌&#xff0c;吻会变成冰块。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习之--抽象类和接口 一.抽象类 1.抽象类的定义 我们知道&#x…

数仓精品理论-做大数据还有没有前途?

数仓精品理论-做大数据还有没有前途&#xff1f; 做大数据还有没有前途&#xff1f;大数据三要三不要我来讲讲大数据前景 做大数据还有没有前途&#xff1f; 先说&#xff0c;答案是肯定的&#xff0c;但一定要记住三要三不要。 datapulse官网&#xff1a; github:https://data…

cesium gltf控制

gltf格式详解 glTF格式本质上是一个JSON文件。这一文件描述了整个3D场景的内容。它包含了对场景结构进行描述的场景图。场景中的3D对象通过场景结点引用网格进行定义。材质定义了3D对象的外观,动画定义了3D对象的变换操作(比如选择、平移操作)。蒙皮定义了3D对象如何进行骨骼…

黑豹程序员-架构师学习路线图-百科:HTML-网页三剑客

为什么需要HTML 在网站技术发达之前&#xff0c;千年来我们获取信息是通过书籍。电脑流行后我们看文章、小说通过txt文件。看图通过单独的图片流量工具看单个的图片文件。 而HTML把文字和图片一起展示&#xff0c;让今天的电子书成为可能。 另外一点&#xff0c;我们的信息是…