首页 > 编程语言 >【C++初阶学习】第十二弹——stack和queue的介绍和使用

【C++初阶学习】第十二弹——stack和queue的介绍和使用

时间:2024-06-03 22:29:20浏览次数:18  
标签:初阶 队列 元素 C++ queue push 构造函数

C语言栈:数据结构——栈(C语言版)-CSDN博客

C语言队列:数据结构——队列(C语言版)-CSDN博客

前言:

在之前学习C语言的时候,我们已经学习过栈与队列,并学习过如何使用C语言来实现栈与队列,今天,我们用C++来学习这些知识,让我们探索一下其中的新的知识点

目录

一、stack(栈)

1. 栈的概述

​编辑

2. 栈的构造函数和成员函数

3. 栈的使用示例

4. 注意事项

二、queue(队列)

1. 队列的概述

​编辑

2. 队列的构造函数和成员函数

3. 队列的使用示例

4. 注意事项

三、思考题

四、总结


一、stack(栈)

C++中的stack是一种遵循后进先出原则的容器适配器。它提供了一系列标准的操作,使得用户可以方便地实现栈这种数据结构。

1. 栈的概述

在C++标准库中,stack并不直接暴露给用户,而是作为<stack>头文件中stack模板类的声明。这个类是std::deque的封装,因此默认情况下,栈是通过双端队列实现的。但是,用户也可以指定其他的容器作为栈的底层结构,比如std::vectorstd::list

2. 栈的构造函数和成员函数

栈提供了以下构造函数和成员函数,以便用户可以轻松地创建和使用栈:

  • 空栈构造函数:创建一个空的栈。
  • 基于容器的构造函数:使用一个已存在的容器来初始化栈。
  • 拷贝构造函数:创建一个新栈,其内容是另一个栈的副本。

成员函数包括:

  • empty():检查栈是否为空。
  • size():获取栈中的元素数量。
  • top():返回栈顶元素的引用。
  • push(const T&):在栈顶插入一个元素。
  • pop():移除并返回栈顶元素。
  • emplace(const T&):在栈顶位置构造并插入一个元素。
  • swap(stack&):与另一个栈交换元素。

3. 栈的使用示例

以下是一个简单的使用C++栈的示例代码:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> numbers;

    // 压入一些数字
    numbers.push(1);
    numbers.push(2);
    numbers.push(3);

    // 打印栈顶元素
    std::cout << "栈顶元素: " << numbers.top() << std::endl;

    // 弹出栈顶元素
    numbers.pop();

    // 检查栈是否为空
    if (numbers.empty()) {
        std::cout << "栈为空" << std::endl;
    } else {
        std::cout << "栈不为空,栈中有 " << numbers.size() << " 个元素" << std::endl;
    }

    return 0;
}

运行结果:

4. 注意事项

虽然栈的使用看似简单,但在实际应用中仍然需要注意以下几点:

  • 确保不要超过栈的容量,否则可能会导致溢出。
  • 如果你需要频繁地访问栈中的元素,而不是仅仅进行 push 和 pop 操作,可能需要考虑使用其他数据结构。
  • 在模拟实现栈时,要注意内存管理,避免内存泄漏。

二、queue(队列)

C++中的queue是一种遵循先进先出原则的容器适配器。它提供了一系列标准的操作,使得用户可以方便地实现队列这种数据结构。

1. 队列的概述

在C++标准库中,queue并不直接暴露给用户,而是作为<queue>头文件中queue模板类的声明。这个类是std::deque的封装,因此默认情况下,队列是通过双端队列实现的。但是,用户也可以指定其他的容器作为队列的底层结构,比如std::list

2. 队列的构造函数和成员函数

队列提供了以下构造函数和成员函数,以便用户可以轻松地创建和使用队列:

  • 空队列构造函数:创建一个空的队列。
  • 基于容器的构造函数:使用一个已存在的容器来初始化队列。
  • 拷贝构造函数:创建一个新队列,其内容是另一个队列的副本。

成员函数包括:

  • empty():检查队列是否为空。
  • size():获取队列中的元素数量。
  • front():返回队列的第一个元素的引用。
  • back():返回队列的最后一个元素的引用。
  • push(const T&):在队列的尾部插入一个元素。
  • pop():移除并返回队列的第一个元素。
  • emplace(const T&):在队列的尾部位置构造并插入一个元素。
  • swap(queue&):与另一个队列交换元素。

3. 队列的使用示例

以下是一个简单的使用C++队列的示例代码:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> numbers;

    // 插入一些数字
    numbers.push(1);
    numbers.push(2);
    numbers.push(3);

    // 打印队列的第一个元素
    std::cout << "队列的第一个元素: " << numbers.front() << std::endl;

    // 打印队列的最后一个元素
    std::cout << "队列的最后一个元素: " << numbers.back() << std::endl;

    // 弹出队列的第一个元素
    numbers.pop();

    // 检查队列是否为空
    if (numbers.empty()) {
        std::cout << "队列为空" << std::endl;
    } else {
        std::cout << "队列不为空,队列中有 " << numbers.size() << " 个元素" << std::endl;
    }

    return 0;
}

运行结果:

4. 注意事项

虽然队列的使用看似简单,但在实际应用中仍然需要注意以下几点:

  • 确保不要超过队列的容量,否则可能会导致溢出。
  • 如果你需要频繁地访问队列中的元素,而不是仅仅进行 push 和 pop 操作,可能需要考虑使用其他数据结构。
  • 在模拟实现队列时,要注意内存管理,避免内存泄漏。

三、思考题

1、我们学过如何用C语言来模拟实现栈与队列,那我们如今学习了C++STL部分,请思考我们如何用C++来模拟实现栈与队列

2、上面我们讲到这两个的底层容器都是dequeue,那什么是dequeue呢?

3、我们可不可以用其他容器,如vector、list来模拟实现栈与队列?

(这些问题可以先思考一下,我们下篇再讲)

四、总结

上面就是stack和queue的介绍和使用,由于之前有过C语言的学习,所以在使用上难度不大,难的主要体现在它的底层模拟构造上,这些我们将在下一篇进行讲解

感谢各位大佬观看,创作不易,还请各位大佬一键三连!!!

标签:初阶,队列,元素,C++,queue,push,构造函数
From: https://blog.csdn.net/2301_80220607/article/details/139424742

相关文章

  • C++代码实现一个简易http服务端,返回给客户端一张图片
    注意事项sprintf读取字符串时,遇到\0会结束,所以不能用sprintf来读取*pictureBuffervoid*memcpy(void*str1,constvoid*str2,size_tn),str2会覆盖str1里的内容代码#include<func.h>charpictureBuffer[150*1024];charbuffer[200*1024];intmain(){in......
  • C++ tracy性能分析
    #defineTRACY_FIBERS#include"tracy/Tracy.hpp"#include"tracy/TracyC.h"constchar*fiber="job1";TracyCZoneCtxzone;inttest(){std::threadt1([]{TracyFiberEnter(fiber);TracyCZone(ctx,1);......
  • TensorRT c++部署onnx模型
    在了解一些概念之前一直看不懂上交22年开源的TRTModule.cpp和.hpp,好在交爷写的足够模块化,可以配好环境开箱即用,移植很简单。最近稍微了解了神经网络的一些概念,又看了TensorRT的一些api,遂试着部署一下自己在MNIST手写数字数据集上训练的一个LeNet模型,识别率大概有98.9%,实现用pytor......
  • C++命名空间(详解)
    C++基础语法C++基于C语言的改进:c++在C语言的基础上引入并扩充了面向对象的概念C++基础概念:C++是基于C语言而产生的,它即可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计在1998年出现C++98C++成熟他是标......
  • C/C++多文件目录编译
    本人的项目目录如下:-helloworld -header helloworld.h -src helloworld.cpp main.cpp -bin a.exe在编译g++src/main.cppsrc/helloworld.cpp-obin/a.exe时控制台error:fatalerror:header/helloworld.h:Nosuchfileordirectory,源文件是这样#include"he......
  • c++——vector
    c++——vectorvector的介绍vector的简介迭代器的作用vector的迭代器失效问题可能导致vector迭代器失效的操作vector的模拟实现完整代码vector.hTest.h代码测试结果vector的介绍vector的文档介绍vector的简介vector是表示可变大小数组的序列容器。vector采用的连......
  • [C++] 小游戏 斗破苍穹 2.2.1至2.11.5所有版本(下) zty出品
    2.10.6#include<stdio.h>#include<iostream>#include<ctime>#include<bits/stdc++.h>#include<time.h>#include<windows.h>//SLEEP函数usingnamespacestd;intboss1=0,boss2=0;structPlayer{//玩家结构体,并初始化playercharname[21......
  • 编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(武器:排序算法)
    引言现在你已经拥有了c++的基础语法知识,人物已经有了基本属性,那么想要打怪,手里必须要有趁手的武器,各种算法就是手中的武器,要根据怪物的不同特性来选择不同的武器。本章节讲的就是新手第一把武器:排序算法。所谓排序算法就是把一些乱序的序列按照从小到大或从大到小进行排序,是......
  • C++:priority_queue的模拟实现 | 仿函数
    ✨✨✨学习的道路很枯燥,希望我们能并肩走下来!文章目录文章目录前言一priority_queue的介绍二priority_queue的使用三 priority_queue的初步模拟实现四仿函数  4.1什么是仿函数4.2常见仿函数 ​编辑 4.3常见仿函数的模拟实现4.3.1less 4.3.2 gre......
  • c++在Linux下把gbk编码转为utf8编码类型
    #include<iostream>#include<string.h>#include<iconv.h>#include<memory>std::stringgbk_to_utf8(conststd::string&gbk_str){size_tin_len=gbk_str.size();size_tout_len=in_len*4;//设置足够大,确保可以存放转换后的UTF-8字符串std::uni......