【Weiss】【第03章】练习3.25:数组模拟队列

【练习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(6);
 9     //测试插入
10     test.enqueue(2);
11     test.enqueue(3);
12     test.enqueue(5);
13     test.enqueue(7);
14     test.enqueue(11);
15     test.enqueue(13);
16     test.enqueue(17);
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(17);
27     test.enqueue(19);
28     test.enqueue(23);
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(0), rear(0), size(0){}
 6     Simu_Queue(unsigned int _maxsize) :front(0), rear(0), maxsize(_maxsize){ head = new T[maxsize + 1]; }
 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 + 1];
13         for (unsigned i = 0; i < maxsize + 1; ++i)
14             head[i] = another.head[i];
15     }
16     ~Simu_Queue()
17     {
18         delete[] head;
19         front = rear = maxsize = 0;
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 + 1];
31             for (unsigned i = 0; i < maxsize + 1; ++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 + 1 - front; }
40     //判断是否为空
41     bool empty()const{ return front == rear; }
42     //入队
43     bool enqueue(const T &item)
44     {
45         if ((rear + 1) % (maxsize + 1) != front)
46         {
47             head[rear] = item;
48             rear = (rear + 1) % (maxsize + 1);
49             return true;
50         }
51         return false;
52     }
53     //出队
54     bool dequeue()
55     {
56         if (rear != front)
57         {
58             front = (front + 1) % (maxsize + 1);
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 + 1) % (maxsize + 1);
71         }
72     }
73 private:
74     T* head = nullptr;
75     unsigned int front;
76     unsigned int rear;
77     unsigned int maxsize;
78 };
时间: 2024-10-20 09:37:01

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

数组模拟队列

数组模拟队列 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图.其中,maxSize 是该队列的最大容量. 因为队列的输出.输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标, front 会随着数据输出而改变,而 rear 则是随着数据输入而改变.如图所示: 当将数据存入队列时称为 “addQueue”,addQueue 的处理需要有两个步骤:思路分析: (1)将尾指针往后移:rear+1,当 front == rear

03数组模拟环形队列(没有明白)

1,对数组模拟队列的优化,充分利用数组,因此将数组看做是一个环形的(通过取模的方式来实现) 2,分析说明: ①尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意 (rear+1) % maxSize == front   满 ②rear == front   空 ③思路如下: 1,front变量的含义做一个调整,front就指向队列的第一个元素,front的初始值是0 2,rear便令的含义做一个调整,rear指向队列最后一个元素的后一个位置,因为

java 数据结构 用数组实现队列

代码内容 1 package com.structure; 2 3 import java.util.Scanner; 4 5 /** 6 * @auther::9527 7 * @Description: 数组模拟队列 8 * @program: jstl2 9 * @create: 2019-10-05 08:58 10 */ 11 public class ArrayQueueDemo { 12 public static void main(String[] args) { 13 Sca

数据结构与算法—稀疏数组和队列

目录 稀疏数组和队列 1.稀疏数组 1.1 解决方法 1.2 代码实现 2. 队列 2.1 数组模拟队列 2.2 数组模拟环形队列 稀疏数组和队列 1.稀疏数组 所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用.因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据.OK,如果你不明白,那我们来看一个例子. ? 在一个五子棋中,有存盘和续上盘的功能 分析问题:因为该二维数组的很多默认值是 0,因此记录了很多

稀疏数组和队列

一.数据结构的分型 数据结构包括线性结构和非线性结构 线性结构: 1.线性结构是最常见的数据结构,其特点是数据元素之间一对一的线性关系 2.线性结构有两种不同的存储结构(数组)和链式存储结构(链表),顺序存储的线性表称为顺序表,顺序表中存储的元素是连续的 3.链式存储的表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息 4.线性结构常见的有:数组,队列,链表和栈 非线性结构: 包括二维数组,多维数组,广义表,图结构,树结构 二.稀疏数组 当一个数组中大部分元

队列——使用数组模拟环形队列

一.思路分析 上一篇讲到用数组模拟队列,数组无法复用,下面讲解了用数组模拟环形队列的方法,采用取模的方式,使得数组可以重复使用. 首先先对front和rear的含义做了一个调整,front指向队列的第一个元素,rear指向队列最后一个元素的后一个位置.队列满的条件是(rear +1) % maxSize = front ,其中maxSize表示队列的容量.假如maxSize=10, 牺牲掉一个位置,front = 0,此时若rear = 9,队列就已经满了.队列为空的条件是rear == fro

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

3.1略 3.2 string str; //读行 while(getline(cin,str)) cout<<str<<endl; //读单个词 while(cin>>str) cout<<str<<endl; 3.3 输入运算符读到空白符结束 getline读到换行符结束,并丢弃换行符 3.4 比较大小. 比较大小是比较的第一个不相同的字符的大小. int main() { string a,b; cin>>a>>b;

第03章-VTK系统概述(1)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] 本章旨在介绍VTK系统的总体概述,并讲解运用C++.Java.Tcl和Python等语言进行VT

groovy入门 第03章 字符串和正则表达式

字符串和正则表达式 3.1字符串字面值 可以使用单引号.双引号.三引号来封装字符串. 使用单引号封装的字符串就是字符串序列本身. 使用双引号可以嵌套单引号,并可以将表达式包含进来. 使用三引号可以包含多行文本. def age=25 'My age is ${age}'            // 输出My age is ${age} "My age is ${age}"           //输出My age is 25 """'My age is $