【练习3.25】

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

a.链表

b.数组

Answer:

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

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

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

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

测试代码:

 #include <iostream>
#include "queue.h"
using namespace std;
using namespace queue;
template class Queue<int>;
int main(void)
{
Simu_Queue<int> test();
//测试插入
test.enqueue();
test.enqueue();
test.enqueue();
test.enqueue();
test.enqueue();
test.enqueue();
test.enqueue();
test.traverse();
cout << endl;
//测试删除
test.dequeue();
test.dequeue();
test.dequeue();
test.traverse();
cout << endl;
//测试绕数组遍历
test.enqueue();
test.enqueue();
test.enqueue();
test.traverse();
cout << endl; system("pause");
}

实现代码:

 //练习3.25新增,用数组模拟队列
template <typename T> class Simu_Queue
{
public:
Simu_Queue() :head(nullptr), front(), rear(), size(){}
Simu_Queue(unsigned int _maxsize) :front(), rear(), maxsize(_maxsize){ head = new T[maxsize + ]; }
Simu_Queue(const Simu_Queue& another)
{
front = another.front;
rear = another.rear;
maxsize = another.maxsize;
head = new T[maxsize + ];
for (unsigned i = ; i < maxsize + ; ++i)
head[i] = another.head[i];
}
~Simu_Queue()
{
delete[] head;
front = rear = maxsize = ;
head = nullptr;
}
Simu_Queue& operator=(const Simu_Queue& another)
{
if (this != &another)
{
delete[] head;
front = another.front;
rear = another.rear;
maxsize = another.maxsize;
head = new T[maxsize + ];
for (unsigned i = ; i < maxsize + ; ++i)
head[i] = another.head[i];
}
}
public:
//返回最大元素量
unsigned int size()const{ return maxsize; }
//返回当前元素量
unsigned int length()const{ return front <= rear ? rear - front : rear + maxsize + - front; }
//判断是否为空
bool empty()const{ return front == rear; }
//入队
bool enqueue(const T &item)
{
if ((rear + ) % (maxsize + ) != front)
{
head[rear] = item;
rear = (rear + ) % (maxsize + );
return true;
}
return false;
}
//出队
bool dequeue()
{
if (rear != front)
{
front = (front + ) % (maxsize + );
return true;
}
return false;
}
//输出队列元素
void traverse()const
{
unsigned int temp = front;
while (temp != rear)
{
cout << " " << head[temp] << flush;
temp = (temp + ) % (maxsize + );
}
}
private:
T* head = nullptr;
unsigned int front;
unsigned int rear;
unsigned int maxsize;
};

【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. 20180110labview串口传输实时显示相关内容

    下一步:1.在原有文件不变的基础上,输出实时波形文件,完整的4pmt4ld,并将对应的源探布配通道编号显示在面板上,对应的通道数据索引输出.2.在一次测量OK的那个文件里用while指定字节读取,注意 ...

  2. Java POI导出Excel不弹框选择下载路径(下载文件不选择下载路径,默认) Chrome

    在Chrome浏览器中,Java导出Excel文件时,浏览器弹出提示框,需要选择下载路径 在Chrome中的高级设置中,把“下载前询问每个文件的保存位置”去掉就解决了 DEEPLOVE(LC)

  3. 转:zabbix 更改maps图标

    更改Zabbix map图标 Zabbix的maps用来图形化显示监控设备的拓扑图,并且以不同的标记显示故障事件,通过该图表很直观的显示设备的整体情况.系统默认的图标比较简陋,如图十一所示.通过更改系 ...

  4. 苹果又要召回iPhone 7!这到底是要闹哪样?

    7!这到底是要闹哪样?" title="苹果又要召回iPhone 7!这到底是要闹哪样?"> 现在的苹果虽然刚刚收获了史上最赚钱的一个季度--营收和利润均创下史上最 ...

  5. Redis4配置文件详解

    转载链接https://www.cnblogs.com/jeffen/p/6077661.html 守护进程模式 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 ...

  6. python有关汉字编码问题

    python分为:程序编码(python安装程序).文件编码. 查看程序编码方式:sys.getdefaultencoding() 查看文件编码方式:1.import  chardet  2. f = ...

  7. 腾讯入股Snap,能救“阅后即焚”的命吗?

    ​ ​   互联网社交的强大包容性,让各种社交形式都能有着较多的受众群体.普适性极广的QQ.微信."脸谱":专攻陌生人社交的陌陌:让人们发布意见的微博--当然也少不了"阅 ...

  8. gcc编译器常用选项的含义

    -w: 关闭编译时的警告, 也就是编译后不显示任何warning,因此有时编译中会出现一些诸如数据转换之类的可忽略警告, -Wall: 显示编译后所有警告 -W: 显示警告,但是只是显示编译器认为的会 ...

  9. 迈克尔·乔丹:几百年内AI不会觉醒

    ​​ 此乔丹非飞人乔丹.他是研究统计学和计算机科学家,目前研究的领域正是普通人所说的人工智能.权威的学术搜索引擎Semantic Scholar在2105年做了一项排名,关于计算机科学领域谁最具影响力 ...

  10. JavaScript中点击按钮弹出新的浏览器窗口

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.js * 作者:常轩 * 微信公众号:Worldhel ...