C++ Queue队列类模版实例详解

目录
  • 1.队列的介绍
  • 2.代码实现
  • 3.测试运行
  • 总结

1.队列的介绍

队列的定义

  • 队列(Queue)是一种线性存储结构。它有以下几个特点:
  • 按照"先进先出(FIFO, First-In-First-Out)"方式进出队列。
  • 队列只允许在"队首"进行取出操作(出队列),在"队尾"进行插入操作(入队列 )

队列实现的方式有两种

  • 基于动态数组实现
  • 基于链表形式实现

队列需要实现的函数

  • T dequeue() : 出队列,并返回取出的元素
  • void enqueue(const T &t) : 入队列
  • T &head() : 获取队首数据,但是不会被取出
  • const T &head() const : 获取const类型队首数据
  • int length() const: 获取数量(父类已经实现)
  • void clear(): 清空队列(父类已经实现)

2.代码实现

本章,我们实现的队列基于链表形式实现,它的父类是我们之前实现的LinkedList类:

C++ 双向循环链表类模版实例详解

所以Queue.h代码如下:

#ifndef QUEUE_H
#define QUEUE_H
#include "throw.h"
// throw.h里面定义了一个ThrowException抛异常的宏,如下所示:
//#include <iostream>
//using namespace std;
//#define ThrowException(errMsg)  {cout<<__FILE__<<" LINE"<<__LINE__<<": "<<errMsg<<endl; (throw errMsg);}
#include "LinkedList.h"
template < typename T>
class Queue : public LinkedList<T>
{
public:
    inline void enqueue(const T &t) { LinkedList<T>::append(t); }
    inline T dequeue()
    {
        if(LinkedList<T>::isEmpty()) {        // 如果栈为空,则抛异常
            ThrowException("Stack is empty ...");
        }
        T t = LinkedList<T>::get(0);
        LinkedList<T>::remove(0);
        return t;
    }
    inline T &head()
    {
        if(LinkedList<T>::isEmpty()) {        // 如果栈为空,则抛异常
            ThrowException("Stack is empty ...");
        }
        return LinkedList<T>::get(0);
    }
    inline const T &head() const
    {
        if(LinkedList<T>::isEmpty()) {        // 如果栈为空,则抛异常
            ThrowException("Stack is empty ...");
        }
        return LinkedList<T>::get(0);
    }
};
#endif // QUEUE_H

3.测试运行

int main(int argc, char *argv[])
{
    Queue<int> queue;
    cout<<"******* current length:"<<queue.length()<<endl;
    for(int i = 0; i < 5; i++) {
        cout<<"queue.enqueue:"<<i<<endl;
        queue.enqueue(i);
    }
    cout<<"******* current length:"<<queue.length()<<endl;
    while(!queue.isEmpty()) {
        cout<<"queue.dequeue:"<<queue.dequeue()<<endl;
    }
    return 0;
}

运行打印:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 详解c++优先队列priority_queue的用法

    既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 和队列基本操作相同: top 访问队头元素 empty 队列是否为空 size 返回队列内元素个数 push 插入元素到队尾 (并排序) emplace 原地构造一个元素并插入队列 pop 弹出队头元素 swap 交换内容 定义:prio

  • c++优先队列(priority_queue)用法详解

    普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除. 在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, largest out)的行为特征. 首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队. 优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的. 和队列基本

  • C++ 中"priority_queue" 优先级队列实例详解

    C++ 中"priority_queue" 优先级队列实例详解 1. 简介 标准库队列使用了先进先出(FIFO)的存储和检索策略. 进入队列的对象被放置在尾部, 下一个被取出的元素则取自队列的首部. 标准库提供了两种风格的队列: FIFO 队列(FIFO queue, 简称 queue), 以及优先级队列(priority queue). priority_queue 允许用户为队列中存储的元素设置优先级. 这种队列不是直接将新元素放置在队列尾部, 而是放在比它优先级低的元素前面. 标

  • C++ Queue队列类模版实例详解

    目录 1.队列的介绍 2.代码实现 3.测试运行 总结 1.队列的介绍 队列的定义 队列(Queue)是一种线性存储结构.它有以下几个特点: 按照"先进先出(FIFO, First-In-First-Out)"方式进出队列. 队列只允许在"队首"进行取出操作(出队列),在"队尾"进行插入操作(入队列 ) 队列实现的方式有两种 基于动态数组实现 基于链表形式实现 队列需要实现的函数 T dequeue() : 出队列,并返回取出的元素 void e

  • C++Stack栈类模版实例详解

    目录 1.栈的介绍 2.栈实现 3.代码测试 总结 1.栈的介绍 栈的实现方式分为3种 基于静态数组实现,内部预设一个很大的数组对象, 实现简单,缺点是空间受限. 基于动态数组实现,内部预设一个容量值,然后分配一段内存空间数组,如果入栈大于默认容量值时,则再次扩大分配新的内存数组,并将旧数组拷贝至新数组及释放旧数组. 基于双向循环链表实现 栈的函数需要实现如下所示: T pop() : 出栈并返回栈顶元素 void  push(const T &t) : 入栈 const T & top(

  • C++ 双向循环链表类模版实例详解

    目录 1.插入某个节点流程 2.构造函数修改 3.重新实现append和prepend函数 4.修改迭代器类 5.LinkedList.h代码如下 6.测试运行 总结 在上章C++图解单向链表类模板和iterator迭代器类模版详解 我们学习了单链表,所以本章来学习双向循环链表 我们在上个文章代码上进行修改, 由于双向循环链表在我们之前学的单链表上相对于较为复杂,所以需要注意的细节如下所示. 1.插入某个节点流程 如下图所示: 对应代码如下所示: /*插入一个新的节点*/ bool insert

  • Linux消息队列实现进程间通信实例详解

    Linux消息队列实现进程间通信实例详解 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度. 二.在Linux中使用消息队列 Linux提供了一系列消息队列的函数接口来让我们方便地使用

  • Redis 实现队列原理的实例详解

    Redis 实现队列原理的实例详解 场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台在去处理这些请求 ·抢购场景,先入先出的模式 命令: rpush + blpop 或 lpush + brpop rpush : 往列表右侧推入数据 blpop : 客户端阻塞直到队列有值输出 简单队列: simple.php $stmt = $pdo->prepare('select id, c

  • Java自定义异常类的实例详解

    Java自定义异常类的实例详解 为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写.我们常用的类ArithmeticException,NullPointerException,NegativeArraySizeException,ArrayIndexoutofBoundsException,SecurityException这些类,都是继续着RuntimeException这个父类,而这个父类还有一个父类是Exception.那么我们自己写异常类的时候,也是继续Excepti

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • C# Random类随机函数实例详解

    目录 引言 一.创建界面 二.效果展示 三.Random类方法 四.代码逻辑 总结: 引言 Random类是非常值得学习的一个类,所以我们今天一起学习一下Random这个类,对于模拟数据这个是随机类可是一个好东西,我们可以用这个随机函数模拟我们想要的数据,从而实现数据模拟,为了更好的学习随机数Random,我们做一个随机挑选饭菜的随机选择器,为了更好的学习,创作不易,点赞关注评论收藏!!!你的点赞是我学习的动力,你点赞是我创作的方向. 一.创建界面 我们平时有选择恐惧症的,每天的人生难题就是今天

  • Python文件操作类操作实例详解

    本文讲述了Python文件操作类的操作实例,详细代码如下: #!/usr/bin/env python #!/usr/bin/env python #coding:utf-8 # Purpose: 文件操作类 #声明一个字符串文本 poem=''' Programming is fun测试 When the work is done if you wanna make your work also fun: use Python! ''' #创建一个file类的实例,模式可以为:只读模式('r'

  • C++ 动态数组模版类Vector实例详解

    目录 1.实现机制 2.代码实现 3.测试运行 总结 1.实现机制 内部主要通过m_capacity数组容量成员和m_length数组有效长度成员来维护一个T* data数组空间. 内部默认分配一定数量大小的数组指针,每次append尾部追加的时候,无需再次分配空间,直接赋值标志length长度,假如超过当前空间容量,则再次扩大分配新的内存数组,并将旧数组拷贝至新数组及释放旧数组. Vector需要实现的public函数如下所示: inline int capacity() : 获取容量 inl

随机推荐