【练习3.25】

编写实现队列的例程,使用

a.链表

b.数组

Answer:

在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以。

数组模拟队列和链表的两点小不同是:

①、数组空间有限,入队需要检测数组是否已经满

②、数组经过几次操作后,rear可能绕回front前面,所以许多操作都要用模来实现。

测试代码:

  1. #include <iostream>
  2. #include "queue.h"
  3. using namespace std;
  4. using namespace queue;
  5. template class Queue<int>;
  6. int main(void)
  7. {
  8. Simu_Queue<int> test();
  9. //测试插入
  10. test.enqueue();
  11. test.enqueue();
  12. test.enqueue();
  13. test.enqueue();
  14. test.enqueue();
  15. test.enqueue();
  16. test.enqueue();
  17. test.traverse();
  18. cout << endl;
  19. //测试删除
  20. test.dequeue();
  21. test.dequeue();
  22. test.dequeue();
  23. test.traverse();
  24. cout << endl;
  25. //测试绕数组遍历
  26. test.enqueue();
  27. test.enqueue();
  28. test.enqueue();
  29. test.traverse();
  30. cout << endl;
  31.  
  32. system("pause");
  33. }

实现代码:

  1. //练习3.25新增,用数组模拟队列
  2. template <typename T> class Simu_Queue
  3. {
  4. public:
  5. Simu_Queue() :head(nullptr), front(), rear(), size(){}
  6. Simu_Queue(unsigned int _maxsize) :front(), rear(), maxsize(_maxsize){ head = new T[maxsize + ]; }
  7. Simu_Queue(const Simu_Queue& another)
  8. {
  9. front = another.front;
  10. rear = another.rear;
  11. maxsize = another.maxsize;
  12. head = new T[maxsize + ];
  13. for (unsigned i = ; i < maxsize + ; ++i)
  14. head[i] = another.head[i];
  15. }
  16. ~Simu_Queue()
  17. {
  18. delete[] head;
  19. front = rear = maxsize = ;
  20. head = nullptr;
  21. }
  22. Simu_Queue& operator=(const Simu_Queue& another)
  23. {
  24. if (this != &another)
  25. {
  26. delete[] head;
  27. front = another.front;
  28. rear = another.rear;
  29. maxsize = another.maxsize;
  30. head = new T[maxsize + ];
  31. for (unsigned i = ; i < maxsize + ; ++i)
  32. head[i] = another.head[i];
  33. }
  34. }
  35. public:
  36. //返回最大元素量
  37. unsigned int size()const{ return maxsize; }
  38. //返回当前元素量
  39. unsigned int length()const{ return front <= rear ? rear - front : rear + maxsize + - front; }
  40. //判断是否为空
  41. bool empty()const{ return front == rear; }
  42. //入队
  43. bool enqueue(const T &item)
  44. {
  45. if ((rear + ) % (maxsize + ) != front)
  46. {
  47. head[rear] = item;
  48. rear = (rear + ) % (maxsize + );
  49. return true;
  50. }
  51. return false;
  52. }
  53. //出队
  54. bool dequeue()
  55. {
  56. if (rear != front)
  57. {
  58. front = (front + ) % (maxsize + );
  59. return true;
  60. }
  61. return false;
  62. }
  63. //输出队列元素
  64. void traverse()const
  65. {
  66. unsigned int temp = front;
  67. while (temp != rear)
  68. {
  69. cout << " " << head[temp] << flush;
  70. temp = (temp + ) % (maxsize + );
  71. }
  72. }
  73. private:
  74. T* head = nullptr;
  75. unsigned int front;
  76. unsigned int rear;
  77. unsigned int maxsize;
  78. };

【Weiss】【第03章】练习3.25:数组模拟队列的更多相关文章

  1. uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列

    题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...

  2. php中数组模拟队列、栈的函数以及数组指针操作

    1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...

  3. Java数组模拟队列 + 优化

    队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图)  数组模拟队列 队列本身是有序列表 ...

  4. Java数组模拟队列

    队列 先进先出 什么意思呢? 我的理解:队列就是一个数组(不包含链表),然后我们给它施加一个存数据和取数据的规则 当只允许从一端存数据,从另一端取数据的数组,就是队列,我们要做的就是给这个数组施加我们 ...

  5. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

  6. 数据结构算法学习之队列(数组模拟java实现)

    数组模拟队列 数组模拟队列 今天学习数组模拟队列.队列常用于生活中的方方面面.比如银行叫号排队.实际上就是队列.所有人抽号排队.先去的先抽号.所以靠前的号最后会先被叫到然后出队.后边的会随之往前移位. ...

  7. 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

    [练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...

  8. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  9. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

随机推荐

  1. python爬虫心得(第一天)

    爬虫是什么? 我个人觉得用简单通俗的话来说就是在浏览网页的过程中将有价值的信息下载到本地硬盘或者是储存到数据库中的行为. 爬虫的基础认知 可以参考此链接:https://www.imooc.com/a ...

  2. Mybatis工作流程及其原理与解析

    Mybatis简介:    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBat ...

  3. JSF技术web.xml配置解析

    对Java tutorial-examples中jsf hell1的web.xml配置文件的解析 <?xml version="1.0" encoding="UTF ...

  4. struts2和springmvc性能比较2

    我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置.spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外). Spring ...

  5. 用shell脚本新建文件并自动生成头说明信息

    目标: 新建文件后,直接给文件写入下图信息 代码实现: [root@localhost test]# vi AutoHead.sh #!/bin/bash #此程序的功能是新建shell文件并自动生成 ...

  6. 重大改革!Python,最接近人工智能的语言~将被加入高考科目!

    就在前几天,和一位浙江省高校的信息技术老师聊天,我得到了一个震惊的消息: 明年,浙江省信息技术教材将不会在使用晦涩难懂的VB语言,而是改学更简单易懂的Python语言.也就是说, Python语言将纳 ...

  7. Turn and Stun server · J

    本文简介了Turnserver(Turn + Stun)服务器的搭建.Turnserver主要提供了stun服务,支撑NAT.防火墙穿透,turn服务器,支撑打洞失败时的数据中转.使用场景上类似于前端 ...

  8. Mysql报错:Authentication .....Reading from the stream has failed

    连接Mysql5.7版本的数据库出现报错:Authentication to host '171.13.164.***' for user 'root' using method 'mysql_nat ...

  9. ZOJ 4109 Welcome Party

    题目链接:(https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370504)(https://vjudge.net/proble ...

  10. 【Amaple教程】5. 插件

    Amaple 拥有非常强大插件功能,这也是它的突出功能之一,Amaple插件一般表现为功能块(函数)或功能块(包含一系列函数和属性的Object对象),它除了支持Amaple规范定义的插件外,还支持所 ...