当前位置: 首页 > article >正文

C++初阶(十七)--STL--stack和queue详解及使用

目录

stack

概念

stack的定义

stack的使用

queue

概念

queue的定义

queue的使用


在 C++ 的标准模板库(STL)中,stack(栈)和queue(队列)是非常重要的容器适配器。它们基于其他基础容器实现,为我们提供了方便且高效的数据存储和操作方式,在许多算法和程序设计场景中都有着广泛的应用。本篇博客将详细介绍stackqueue的相关知识及其使用方法。

stack

概念

栈是一种先进后出(First In Last Out,FILO)的数据结构。就好比一个只能从一端放入和取出物品的容器,先放入的物品要等后放入的物品都取出后才能被取出。

stack的定义

在 STL 中,stack是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vectorlist作为底层容器,例如:

#include <stack>
#include <vector>
#include <list>

int main() 
{
    //使用默认的适配器
    std::stack<int> st1;

    // 使用 vector 作为底层容器的 stack
    std::stack<int, std::vector<int>> s1;
    // 使用 list 作为底层容器的 stack
    std::stack<int, std::list<int>> s2;
    return 0;
}

stack的使用

 这些成员函数大部分都已经是非常熟悉的了,所以这里直接把常见的用简单代码示范一下即可。

#include <iostream>
#include <stack>

int main() 
{
    // 创建一个存储整数的栈
    std::stack<int> myStack;

    // 使用push函数向栈中插入元素
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 使用size函数获取栈的大小
    std::cout << "Stack size: " << myStack.size() << std::endl;

    // 使用top函数获取栈顶元素
    std::cout << "Top element: " << myStack.top() << std::endl;

    // 使用pop函数弹出栈顶元素
    myStack.pop();

    // 再次查看栈顶元素和栈的大小
    std::cout << "After pop, top element: " << myStack.top() << std::endl;
    std::cout << "After pop, stack size: " << myStack.size() << std::endl;

    // 使用empty函数判断栈是否为空
    if (myStack.empty()) {
        std::cout << "Stack is empty." << std::endl;
    } else {
        std::cout << "Stack is not empty." << std::endl;
    }

    return 0;
}

 接下来不是很常用的一些,只介绍简单的使用,用时可以再去查文档

emplace

emplace函数用于在栈顶原地构造元素,相比push,如果插入的是对象,emplace可能会更高效,因为它避免了额外的复制或移动操作。

#include <iostream>
#include <stack>
#include <string>
using namespace  std;
struct Person 
{
    string name;
    int age;
    Person(string n, int a) 
        : name(n)
        , age(a) 
    {}
};

int main() {
    stack<Person> people;
    // 使用emplace构造并插入元素
    people.emplace("Alice", 25);
    if (!people.empty()) 
    {
        const Person& p = people.top();
        cout << "Top person: " << p.name << ", age: " << p.age <<endl;
    }
    return 0;
}

swap

swap函数用于交换两个栈的内容。

int main() {
    std::stack<int> stack1;
    stack1.push(1);
    stack1.push(2);

    std::stack<int> stack2;
    stack2.push(3);
    stack2.push(4);

    // 交换两个栈的内容
    stack1.swap(stack2);

    return 0;
}

queue

概念

队列是一种先进先出(First In First Out,FIFO)的数据结构。想象成一个排队的场景,先进入队列的元素先被处理。

queue的定义

在 STL 中,queue是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vectorlist作为底层容器,例如:

//默认容器
queue<int> q1;
//特定适配器
queue<int, vector<int>> q2;
queue<int, list<int>> q3;

queue的使用

这里对常见函数进行简单示范:

#include <queue>
#include <iostream>

using namespace std;

struct MyStruct 
{
    int x;
    MyStruct(int a) 
        : x(a) 
    {}
};

int main() 
{
    // 1. 使用默认构造函数创建队列
    queue<int> myQueue;

    // 2. 使用empty检查队列是否为空
    if (myQueue.empty()) 
    {
        cout << "队列是空的" << endl;
    }

    // 3. 使用push插入元素
    myQueue.push(1);
    myQueue.push(2);

    // 4. 使用size获取队列大小
    cout << "队列的大小是: " << myQueue.size() << endl;

    // 5. 使用front访问队列头部元素
    int frontElement = myQueue.front();
    cout << "队列头部的元素是: " << frontElement << endl;

    // 6. 使用back访问队列尾部元素
    int backElement = myQueue.back();
    cout << "队列尾部的元素是: " << backElement << endl;

    // 7. 使用emplace构造并插入元素
    queue<MyStruct> myStructQueue;
    myStructQueue.emplace(3);

    // 8. 使用pop移除队列头部元素
    myQueue.pop();

    // 9. 交换两个队列(这里使用成员函数swap)
    queue<int> anotherQueue;
    anotherQueue.push(4);
    myQueue.swap(anotherQueue);

    // 10. 使用关系运算符比较队列(这里比较是否相等)
    if (myQueue == anotherQueue) 
    {
        cout << "两个队列相等" << endl;
    }

    // 11. 使用非成员函数swap交换队列(与成员函数swap功能类似)
    queue<int> queue1;
    queue1.push(5);
    queue<int> queue2;
    queue2.push(6);
    swap(queue1, queue2);

    return 0;
}

 


本篇博客到此结束,欢迎评论区留言~


http://www.kler.cn/a/419179.html

相关文章:

  • C#基础之委托,事件
  • 【css实现收货地址下边的平行四边形彩色线条】
  • 基于rpcapd与wireshark的远程实时抓包的方法
  • 探索Python WebSocket新境界:picows库揭秘
  • 递归算法讲解(c基础)
  • 基于Java Springboot学生信息管理系统
  • IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“
  • 如何用Excel做数据可视化自动化报表?
  • 泷羽sec-shell(7)for循环与while循环 学习笔记
  • Linux下的三种 IO 复用
  • 文件比较和文件流
  • 大数据治理的介绍与认识
  • LeetCode题解:30.串联所有单词的子串【Python题解超详细,KMP搜索、滑动窗口法】,知识拓展:Python中的排列组合
  • 贝叶斯统计:高斯分布均值μ的后验分布推导
  • 详解QtPDF之 QPdfLink
  • 基于PHP的物流配送管理信息系统的设计与实现
  • 【redis】如何跑
  • flink学习(12)——checkPoint
  • 【Maven】依赖冲突如何解决?
  • 【链表】力扣 2. 两数相加
  • 基于yolov8、yolov5的吸烟行为检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • 如何在 VPS 上使用 Git 设置自动部署
  • linux cenos redis 单机部署
  • 【Linux】磁盘 | 文件系统 | inode
  • 图解人工智能:从规则到深度学习的全景解析
  • LabVIEW将TXT文本转换为CSV格式(多行多列)