C++实现数据结构——队列和栈

队列是线性表的一种特殊形式‌,所有排队场景都是一个队列,记录访问顺序时也经常用到队列。

栈也是线性表的一种特殊形式‌,递归函数的运行过程、算术表达式的处理过程都会用到栈。

队列(queue)是线性表的一种特殊形式‌,其遵循先进先出(FirstInFirstOut,FIFO)的原则。队列有两个关键位置:队尾和队头。队尾是允许执行插入操作的位置,而队头是允许执行删除操作的位置。刚开始时,队列是空的,没有任何元素。例如,在超市购物时,需要结账的顾客加入队列的队尾,也就是新插入的元素成为队尾元素。一个顾客结完账就离开了,排在最前面的顾客就可以开始结账,该顾客就是当前队头元素。这种方式保证了先来的顾客先离开队列,体现了先进先出的原则。队列不允许"插队"因此不允许在队尾以外的其他地方插入元素,也不允许删除其他位置的元素。队列中排队的人数称为队列的长度,当队列中没有顾客时,称为空队列。

这种先进先出的特性使得队列非常适合用来管理需要按照顺序处理的任务,例如打印机的打印任务、消息传递系统中的消息处理任务等。

队列的基本操作有以下5个

  • 创建队列。create0(在本书中用构造函数替代):创建一个空队列。

    入队。enQueue(x):将元素x插入队尾,使之成为队尾元素。

  • 出队。deQueueO:删除队头元素并返回队头元素值。

  • 读取队头元素。getHead():返回队头元素值。

  • 判队列空。isEmptyO:若队列为空,返回true,否则返回false。

根据队列的基本操作,可以得到队列抽象类的定义。

queue.h

复制代码
//
// 队列抽象类
//

#ifndef DS_QUEUE_H
#define DS_QUEUE_H
template <class elemType>
class queue {
public:
    virtual void enQueue(const elemType &x) = 0;  // 入队
    virtual elemType deQueue() = 0;               // 出队
    virtual elemType getHead() const = 0;         // 读取队头元素
    virtual bool isEmpty() const = 0;             // 判队列空
    virtual ~queue() {}                           // 虚析构函数
};
#endif //DS_QUEUE_H

与顺序表不同,队列的插入和删除操作是固定在队尾与队头进行的。

和队列一样,栈(stack)也是一种常见的线性表。在中,插入和删除操作被限定在表的某一端进行。假设每天晚上要把火车停在一条轨道上轨道的尽头是封闭的,那么这个轨道就是一个栈。允许进行插入和删除操作的一端称为"栈顶",另一端称为"栈底"。也就是说,火车只能从一个方向离开,且一列火车要离开的时候,需要把在它之后进入轨道的火车都先移开。栈顶位置的元素称为栈顶元素,若栈中没有元素,则称为"空栈"当需要让一列火车进入轨道时,可以将它放在栈顶,也就是当前空的位置这个过程称为"进栈"(或入栈)。而当需要让一列火车驶离轨道时,则从栈顶取出一列火车,这个过程被称为"出栈"。栈也被叫作"后进先出"的线性表

C++标准库中的队列
std::queue是C++标准库中的队列实现。

复制代码
//
// C++标准库中的队列
//

#include <iostream>
using namespace std;

int main() {

    std::queue<int> queue;

    queue.push(1);//元素入队
    queue.push(2);
    queue.push(3);
    queue.push(4);
    
    queue.pop();//元素出队
    int front = queue.front();//访问队首元素

    int size = queue.size();//获取队列的长度
    bool empty = queue.empty();//判断队列是否为空

    cout << front << " " << size << " " << empty << endl;
    return 0;
}
相关推荐
小江的记录本3 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
落羽的落羽4 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈5 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
yuannl106 小时前
数据结构----二叉排序树(ai修改版)
数据结构
iiiiyu6 小时前
集合进阶(Map集合)
java·大数据·开发语言·数据结构·编程语言
小江的记录本7 小时前
【Java基础】核心关键字:final、static、volatile、synchronized、transient(附《思维导图》+《面试高频考点清单》)
java·前端·数据结构·后端·ai·面试·ai编程
go不是csgo8 小时前
两个Redis数据结构搞定签到和UV统计:Bitmap与HyperLogLog实战
数据结构·redis·uv
悠仁さん8 小时前
数据结构 栈与队
数据结构
Plan-C-9 小时前
二叉树的遍历
java·数据结构·算法
历程里程碑9 小时前
54 深入解析poll多路复用技术
java·linux·服务器·开发语言·前端·数据结构·c++