一、介绍

队列(Queue),是一种线性存储结构。它有以下几个特点:
(01) 队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的。
(02) 队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。
队列通常包括的两种操作:入队列 和 出队列。

二、实现

C++的STL中本身就包含了list类,基本上该list类就能满足我们的需求,所以很少需要我们自己来实现。本部分介绍2种C++实现。
1. C++实现一:数组实现的队列,能存储任意类型的数据。
2. C++实现二:C++的 STL 中自带的"队列"(list)的示例。

1.C++实现一:数组实现的队列,能存储任意类型的数据。

实现代码:.h

  1. #ifndef ARRAY_QUEUE_HXX
  2. #define ARRAY_QUEUE_HXX
  3.  
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. template<class T> class ArrayQueue{
  8. public:
  9. ArrayQueue();
  10. ~ArrayQueue();
  11.  
  12. void add(T t);
  13. T front();
  14. T pop();
  15. int size();
  16. int is_empty();
  17.  
  18. private:
  19. T *arr;
  20. int count;
  21. };
  22.  
  23. // 创建“队列”,默认大小是12
  24. template<class T>
  25. ArrayQueue<T>::ArrayQueue()
  26. {
  27. arr = new T[];
  28. if (!arr)
  29. {
  30. cout<<"arr malloc error!"<<endl;
  31. }
  32. }
  33.  
  34. // 销毁“队列”
  35. template<class T>
  36. ArrayQueue<T>::~ArrayQueue()
  37. {
  38. if (arr)
  39. {
  40. delete[] arr;
  41. arr = NULL;
  42. }
  43. }
  44.  
  45. // 将val添加到队列的末尾
  46. template<class T>
  47. void ArrayQueue<T>::add(T t)
  48. {
  49. arr[count++] = t;
  50. }
  51.  
  52. // 返回“队列开头元素”
  53. template<class T>
  54. T ArrayQueue<T>::front()
  55. {
  56. return arr[];
  57. }
  58.  
  59. // 返回并删除“队列末尾的元素”
  60. template<class T>
  61. T ArrayQueue<T>::pop()
  62. {
  63. int i = ;;
  64. T ret = arr[];
  65.  
  66. count--;
  67. while (i++<count)
  68. arr[i-] = arr[i];
  69.  
  70. return ret;
  71. }
  72.  
  73. // 返回“队列”的大小
  74. template<class T>
  75. int ArrayQueue<T>::size()
  76. {
  77. return count;
  78. }
  79.  
  80. // 返回“队列”是否为空
  81. template<class T>
  82. int ArrayQueue<T>::is_empty()
  83. {
  84. return count==;
  85. }
  86.  
  87. #endif

测试代码: .cpp

  1. #include <iostream>
  2. #include "ArrayQueue.h"
  3. using namespace std;
  4.  
  5. /**
  6. * C++ : 数组实现“队列”,能存储任意数据。
  7. *
  8. * @author skywang
  9. * @date 2013/11/07
  10. */
  11. int main()
  12. {
  13. int tmp=;
  14. ArrayQueue<int> *astack = new ArrayQueue<int>();
  15.  
  16. // 将10, 20, 30 依次推入队列中
  17. astack->add();
  18. astack->add();
  19. astack->add();
  20.  
  21. // 将“队列开头元素”赋值给tmp,并删除“该元素”
  22. tmp = astack->pop();
  23. cout<<"tmp="<<tmp<<endl;
  24.  
  25. // 只将“队列开头的元素”赋值给tmp,不删除该元素.
  26. tmp = astack->front();
  27. cout<<"tmp="<<tmp<<endl;
  28.  
  29. astack->add();
  30.  
  31. cout<<"is_empty()="<<astack->is_empty()<<endl;
  32. cout<<"size()="<<astack->size()<<endl;
  33. while (!astack->is_empty())
  34. {
  35. tmp = astack->pop();
  36. cout<<tmp<<endl;
  37. }
  38.  
  39. return ;
  40. }

2. C++实现二:C++的 STL 中自带的"队列"(list)的示例

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4.  
  5. /**
  6. * C++ : STL中的队列(queue)的演示程序。
  7. *
  8. * @author skywang
  9. * @date 2013/11/07
  10. */
  11. int main ()
  12. {
  13. int tmp=;
  14. queue<int> iqueue;
  15.  
  16. // 将10, 20, 30 依次加入队列的末尾
  17. iqueue.push();
  18. iqueue.push();
  19. iqueue.push();
  20.  
  21. // 删除队列开头的元素
  22. iqueue.pop();
  23.  
  24. // 将“队列开头的元素”赋值给tmp,不删除该元素.
  25. tmp = iqueue.front();
  26. cout<<"tmp="<<tmp<<endl;
  27.  
  28. // 将40加入到队列的末尾
  29. iqueue.push();
  30.  
  31. cout << "empty()=" << iqueue.empty() <<endl;
  32. cout << "size()=" << iqueue.size() <<endl;
  33. while (!iqueue.empty())
  34. {
  35. tmp = iqueue.front();
  36. cout<<tmp<<endl;
  37. iqueue.pop();
  38. }
  39.  
  40. return ;
  41. }

本文来自http://www.cnblogs.com/skywang12345/p/3562279.html

队列的实现——c++的更多相关文章

  1. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  2. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  3. Beanstalkd一个高性能分布式内存队列系统

    高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...

  4. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  5. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  6. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  7. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  8. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  9. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  10. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

随机推荐

  1. HDFS高可用性及其分布式系统思想基础

    源自单点失效问题,也就是当NameNode不可用的时候,用什么办法可以平滑过渡? 最直接的办法是再添加一个备用的NN,这就产生了Active NameNode和Standby NameNode的设计思 ...

  2. 淘宝星星的思路c#

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  3. c++11 stl 学习之 pair

    pair以模板的方式存储两个数据 namespace std {template <typename T1, typename T2>struct pair {// memberT1 fi ...

  4. 选择排序(直接排序)java语言实现

    class demo { public static void main(String[] args) { int[] arr={1,4,2,6,8,9,0,5,3,2,2,4,4,6,7,8}; f ...

  5. 2018.10.16 NOIP模拟 膜法(组合数学)

    传送门 原题,原题,全TM原题. 不得不说天天考原题. 其实这题我上个月做过类似的啊,加上dzyodzyodzyo之前有讲过考试直接切了. 要求的其实就是∑i=lr(ii−l+k)\sum _{i=l ...

  6. linux下mysql命令大全

    1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令: mys ...

  7. IntelliJ IDEA 2017版 开发SpringBoot的全局配置文件使用

    一.全局配置文件 描述:     Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径 ...

  8. 一文读懂:超详细正态分布方差等于o的推导

    (uv)' = [(u+△u)(v+△v) - uv] /△x = (v△u+u△v +△u△v)/△x = v(△u/△x) + u(△v/△x) +(△u△v)/△x =u'v+uv'

  9. Yarn application has already exited with state FINISHED

    如果在运行spark-sql时遇到如下这样的错误,可能是因为yarn-site.xml中的配置项yarn.nodemanager.vmem-pmem-ratio值偏小,它的默认值为2.1,可以尝试改大 ...

  10. C#-流、存储

    流输入输出 VS提供的类库,可方便数据的转移操作,一部分是文件和目录方面 file类 用静态方法,   fileinfo类 用实例方法   dictionary类 用静态方法   dictionary ...