一、简言

使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式)。在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11700048.html。光说不练嘴把式,现在本文使用OC面向对象的思想来实现一下。

 

二、代码

ArrayQueue

  1. //
  2. // ArrayQueue.h
  3. // 运行时
  4. //
  5. // Created by 夏远全 on 2019/10/19.
  6. //
  7.  
  8. #import <Foundation/Foundation.h>
  9.  
  10. NS_ASSUME_NONNULL_BEGIN
  11.  
  12. @interface ArrayQueue : NSObject
  13.  
  14. /**
  15. 构造一个循环队列
  16. @param capacity 队列容量
  17. @return 队列
  18. */
  19. +(instancetype)constrcutArrayQueueWithCapacity:(int)capacity;
  20.  
  21. /**
  22. 入队列
  23. @param element 元素
  24. */
  25. -(void)enQueueWithElement:(id)element;
  26.  
  27. /**
  28. 出队列
  29. @return 元素
  30. */
  31. -(id)deQueueElement;
  32.  
  33. /**
  34. 队列是否为空
  35. @return 布尔值
  36. */
  37. -(BOOL)isEmpty;
  38.  
  39. /**
  40. 队列是否已满
  41. @return 布尔值
  42. */
  43. -(BOOL)isFull;
  44.  
  45. /**
  46. 获取元素个数
  47. @return 个数
  48. */
  49. -(int)eleCount;
  50.  
  51. @end
  52.  
  53. NS_ASSUME_NONNULL_END
  1. //
  2. // ArrayQueue.m
  3. // 运行时
  4. //
  5. // Created by 夏远全 on 2019/10/19.
  6. //
  7.  
  8. #import "ArrayQueue.h"
  9.  
  10. @interface ArrayQueue ()
  11. @property (nonatomic, strong) NSMutableArray *array;
  12. @property (nonatomic, assign) int front;
  13. @property (nonatomic, assign) int rear;
  14. @property (nonatomic, assign) int capacity;
  15. @end
  16.  
  17. @implementation ArrayQueue
  18.  
  19. /**
  20. 构造一个循环队列
  21. @param capacity 队列容量
  22. @return 队列
  23. */
  24. +(instancetype)constrcutArrayQueueWithCapacity:(int)capacity {
  25.  
  26. ///断言一下
  27. assert(capacity>);
  28.  
  29. ArrayQueue *arrayQueue = [[ArrayQueue alloc] init];
  30. arrayQueue.array = [NSMutableArray array]; //初始化容器
  31. arrayQueue.capacity = capacity; //初始化容量
  32. arrayQueue.front = arrayQueue.rear = ; //初始化首尾指针
  33. return arrayQueue;
  34. }
  35.  
  36. /**
  37. 入队列
  38. @param element 元素
  39. */
  40. -(void)enQueueWithElement:(id)element {
  41.  
  42. ///判断队列是否已满
  43. if ([self isFull]) {
  44. NSLog(@"队列已满,元素%@不能被入列, front = %d , rear = %d", element, self.front, self.rear);
  45. return;
  46. }
  47.  
  48. ///插入新元素
  49. self.array[self.rear] = element;
  50.  
  51. ///更新队尾指针
  52. self.rear = (self.rear + ) % self.capacity;
  53.  
  54. NSLog(@"入队列的元素 = %@, front = %d , rear = %d", element, self.front, self.rear);
  55. }
  56.  
  57. /**
  58. 出队列
  59. @return 元素
  60. */
  61. -(id)deQueueElement {
  62.  
  63. ///判断队列是否已空
  64. if ([self isEmpty]) {
  65. NSLog(@"队列已空, front = %d , rear = %d", self.front, self.rear);
  66. return nil;
  67. }
  68.  
  69. ///取出队头的元素
  70. id element = self.array[self.front];
  71.  
  72. ///更新队头指针
  73. self.front = (self.front + ) % self.capacity;
  74.  
  75. NSLog(@"出队列的元素 = %@, front = %d , rear = %d", element, self.front, self.rear);
  76.  
  77. return element;
  78. }
  79.  
  80. /**
  81. 队列是否为空
  82. @return 布尔值
  83. */
  84. -(BOOL)isEmpty {
  85.  
  86. if (self.front == self.rear) {
  87. return YES;
  88. }
  89. return NO;
  90. }
  91.  
  92. /**
  93. 队列是否已满
  94. @return 布尔值
  95. */
  96. -(BOOL)isFull {
  97.  
  98. if (self.front == (self.rear + ) % self.capacity) {
  99. return YES;
  100. }
  101. return NO;
  102. }
  103.  
  104. /**
  105. 获取元素个数
  106. @return 个数
  107. */
  108. -(int)eleCount {
  109.  
  110. int eleCount = (self.rear - self.front + self.capacity) % self.capacity;
  111. NSLog(@"队列元素个数 = %d", eleCount);
  112. return eleCount;
  113. }
  114.  
  115. @end

三、结果

测试

  1. -(void)test_DataStructure_ArrayQueue {
  2.  
  3. /// 构造循环队列
  4. ArrayQueue *arrayQueue = [ArrayQueue constrcutArrayQueueWithCapacity:];
  5.  
  6. /// enter Queue 入队列
  7. [arrayQueue enQueueWithElement:@()];
  8. [arrayQueue enQueueWithElement:@()];
  9. [arrayQueue enQueueWithElement:@()];
  10. [arrayQueue enQueueWithElement:@()];
  11. [arrayQueue enQueueWithElement:@()];
  12.  
  13. /// 全部入队后 get eleCount 元素个数
  14. [arrayQueue eleCount];
  15.  
  16. /// deque Queue 出队列
  17. [arrayQueue deQueueElement];
  18. [arrayQueue deQueueElement];
  19. [arrayQueue deQueueElement];
  20. [arrayQueue deQueueElement];
  21. [arrayQueue deQueueElement];
  22.  
  23. /// 全部出队后 get eleCount 元素个数
  24. [arrayQueue eleCount];
  25.  
  26. }

打印

  1. -- ::57.323138+ 运行时[:] 入队列的元素 = , front = , rear =
  2. -- ::57.323314+ 运行时[:] 入队列的元素 = , front = , rear =
  3. -- ::57.323435+ 运行时[:] 入队列的元素 = , front = , rear =
  4. -- ::57.323544+ 运行时[:] 入队列的元素 = , front = , rear =
  5. -- ::57.323639+ 运行时[:] 队列已满,元素100不能被入列, front = , rear =
  6. -- ::57.323721+ 运行时[:] 队列元素个数 =
  7. -- ::57.323844+ 运行时[:] 出队列的元素 = , front = , rear =
  8. -- ::57.323945+ 运行时[:] 出队列的元素 = , front = , rear =
  9. -- ::57.324033+ 运行时[:] 出队列的元素 = , front = , rear =
  10. -- ::57.324140+ 运行时[:] 出队列的元素 = , front = , rear =
  11. -- ::57.324245+ 运行时[:] 队列已空, front = , rear =
  12. -- ::57.324344+ 运行时[:] 队列元素个数 =

用OC基于数组实现循环队列的更多相关文章

  1. 基于数组的循环队列(C++模板实现)

    循环队列使用数组实现的话,简单.方便.之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了.循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列 ...

  2. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

  3. C语言实现使用动态数组实现循环队列

    我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...

  4. Java数组实现循环队列的两种方法

    用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...

  5. 数组模拟循环队列(java实现)

    1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...

  6. 用OC基于链表实现链队列

    一.简言 在前面已经用C++介绍过链队列的基本算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11692065.html.少说多做,还是上手撸代码实践一下 ...

  7. 深入理解循环队列----循环数组实现ArrayDeque

    我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...

  8. 用数组实现队列(顺序队列&循环队列)

    用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...

  9. java数据结构---循环队列

    #java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...

随机推荐

  1. 《精通Python爬虫框架Scrapy》学习资料

    <精通Python爬虫框架Scrapy>学习资料 百度网盘:https://pan.baidu.com/s/1ACOYulLLpp9J7Q7src2rVA

  2. macOS Catalina Kernel panic 因为意外而重新启动

    0x00 What's Happend? 我的 MacBook Air 在升级到 Catalina 之后,经常在休眠模式重启,随后在桌面上显示"因为意外而重新启动"的信息,以下是跟 ...

  3. diango使用顺序

    使用顺序 settings 静态文件配置 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #文件夹根目录 ...

  4. (python pip安装第三方库超时问题(raise ReadTimeoutErrorself._pool, None, 'Read timed out.')

    (python pip安装第三方库超时问题(raise ReadTimeoutErrorself._pool, None, ‘Read timed out.’)pip工具安装百度经验链接: pip安装 ...

  5. windows重装系统后grub引导菜单修复方法(亲自实验过)

    问题: 电脑安装的是windows7+ubuntu 15.10双系统.windows重装后,grub引导界面消失. 解决方法有两大步: 1.进入ubuntu; 2.在ubuntu中修复grub. 一. ...

  6. 使用layui框架 修改时部分参数未传给后台(查找原因)

    采用的结构: <form class="layui-form reset-form" action="" id="formData"& ...

  7. python的@propert装饰器

    首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问.propert可以有两种用法:可以把一个方法变成只读属性:可以对一些属性进行过滤. 想象这样一个场景,在实例化一个类之后,需 ...

  8. 07. Go 语言接口

    Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...

  9. LeetCode 771: 宝石与石头 Jewels and Stones

    题目: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. You're given strings ...

  10. In .net 4.8,calculate the time cost of serialization in BinaryFormatter,NewtonSoft.json,and System.Text.Json.JsonSerializer.Serialize

    using ConsoleApp390.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; us ...