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;
}
相关推荐
ID_180079054734 小时前
小红书笔记详情API接口基础解析:数据结构与调用方式
数据结构·数据库·笔记
iuu_star10 小时前
C语言数据结构-顺序查找、折半查找
c语言·数据结构·算法
漫随流水11 小时前
leetcode算法(515.在每个树行中找最大值)
数据结构·算法·leetcode·二叉树
一起努力啊~16 小时前
算法刷题--长度最小的子数组
开发语言·数据结构·算法·leetcode
小北方城市网16 小时前
第1课:架构设计核心认知|从0建立架构思维(架构系列入门课)
大数据·网络·数据结构·python·架构·数据库架构
好易学·数据结构16 小时前
可视化图解算法77:零钱兑换(兑换零钱)
数据结构·算法·leetcode·动态规划·力扣·牛客网
独自破碎E16 小时前
【归并】单链表的排序
数据结构·链表
L_090716 小时前
【C++】高阶数据结构 -- 平衡二叉树(AVLTree)
数据结构·c++
冰冰菜的扣jio16 小时前
Redis基础数据结构
数据结构·数据库·redis
Qhumaing17 小时前
C++学习:【PTA】数据结构 7-2 实验6-2(图-邻接表)
数据结构·c++·学习