用OC基于数组实现循环队列
一、简言
使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式)。在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11700048.html。光说不练嘴把式,现在本文使用OC面向对象的思想来实现一下。
二、代码
ArrayQueue
//
// ArrayQueue.h
// 运行时
//
// Created by 夏远全 on 2019/10/19.
// #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface ArrayQueue : NSObject /**
构造一个循环队列
@param capacity 队列容量
@return 队列
*/
+(instancetype)constrcutArrayQueueWithCapacity:(int)capacity; /**
入队列
@param element 元素
*/
-(void)enQueueWithElement:(id)element; /**
出队列
@return 元素
*/
-(id)deQueueElement; /**
队列是否为空
@return 布尔值
*/
-(BOOL)isEmpty; /**
队列是否已满
@return 布尔值
*/
-(BOOL)isFull; /**
获取元素个数
@return 个数
*/
-(int)eleCount; @end NS_ASSUME_NONNULL_END
//
// ArrayQueue.m
// 运行时
//
// Created by 夏远全 on 2019/10/19.
// #import "ArrayQueue.h" @interface ArrayQueue ()
@property (nonatomic, strong) NSMutableArray *array;
@property (nonatomic, assign) int front;
@property (nonatomic, assign) int rear;
@property (nonatomic, assign) int capacity;
@end @implementation ArrayQueue /**
构造一个循环队列
@param capacity 队列容量
@return 队列
*/
+(instancetype)constrcutArrayQueueWithCapacity:(int)capacity { ///断言一下
assert(capacity>); ArrayQueue *arrayQueue = [[ArrayQueue alloc] init];
arrayQueue.array = [NSMutableArray array]; //初始化容器
arrayQueue.capacity = capacity; //初始化容量
arrayQueue.front = arrayQueue.rear = ; //初始化首尾指针
return arrayQueue;
} /**
入队列
@param element 元素
*/
-(void)enQueueWithElement:(id)element { ///判断队列是否已满
if ([self isFull]) {
NSLog(@"队列已满,元素%@不能被入列, front = %d , rear = %d", element, self.front, self.rear);
return;
} ///插入新元素
self.array[self.rear] = element; ///更新队尾指针
self.rear = (self.rear + ) % self.capacity; NSLog(@"入队列的元素 = %@, front = %d , rear = %d", element, self.front, self.rear);
} /**
出队列
@return 元素
*/
-(id)deQueueElement { ///判断队列是否已空
if ([self isEmpty]) {
NSLog(@"队列已空, front = %d , rear = %d", self.front, self.rear);
return nil;
} ///取出队头的元素
id element = self.array[self.front]; ///更新队头指针
self.front = (self.front + ) % self.capacity; NSLog(@"出队列的元素 = %@, front = %d , rear = %d", element, self.front, self.rear); return element;
} /**
队列是否为空
@return 布尔值
*/
-(BOOL)isEmpty { if (self.front == self.rear) {
return YES;
}
return NO;
} /**
队列是否已满
@return 布尔值
*/
-(BOOL)isFull { if (self.front == (self.rear + ) % self.capacity) {
return YES;
}
return NO;
} /**
获取元素个数
@return 个数
*/
-(int)eleCount { int eleCount = (self.rear - self.front + self.capacity) % self.capacity;
NSLog(@"队列元素个数 = %d", eleCount);
return eleCount;
} @end
三、结果
测试
-(void)test_DataStructure_ArrayQueue {
/// 构造循环队列
ArrayQueue *arrayQueue = [ArrayQueue constrcutArrayQueueWithCapacity:];
/// enter Queue 入队列
[arrayQueue enQueueWithElement:@()];
[arrayQueue enQueueWithElement:@()];
[arrayQueue enQueueWithElement:@()];
[arrayQueue enQueueWithElement:@()];
[arrayQueue enQueueWithElement:@()];
/// 全部入队后 get eleCount 元素个数
[arrayQueue eleCount];
/// deque Queue 出队列
[arrayQueue deQueueElement];
[arrayQueue deQueueElement];
[arrayQueue deQueueElement];
[arrayQueue deQueueElement];
[arrayQueue deQueueElement];
/// 全部出队后 get eleCount 元素个数
[arrayQueue eleCount];
}
打印
-- ::57.323138+ 运行时[:] 入队列的元素 = , front = , rear =
-- ::57.323314+ 运行时[:] 入队列的元素 = , front = , rear =
-- ::57.323435+ 运行时[:] 入队列的元素 = , front = , rear =
-- ::57.323544+ 运行时[:] 入队列的元素 = , front = , rear =
-- ::57.323639+ 运行时[:] 队列已满,元素100不能被入列, front = , rear =
-- ::57.323721+ 运行时[:] 队列元素个数 =
-- ::57.323844+ 运行时[:] 出队列的元素 = , front = , rear =
-- ::57.323945+ 运行时[:] 出队列的元素 = , front = , rear =
-- ::57.324033+ 运行时[:] 出队列的元素 = , front = , rear =
-- ::57.324140+ 运行时[:] 出队列的元素 = , front = , rear =
-- ::57.324245+ 运行时[:] 队列已空, front = , rear =
-- ::57.324344+ 运行时[:] 队列元素个数 =
用OC基于数组实现循环队列的更多相关文章
- 基于数组的循环队列(C++模板实现)
循环队列使用数组实现的话,简单.方便.之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了.循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列 ...
- 教你如何使用Java手写一个基于数组实现的队列
一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...
- C语言实现使用动态数组实现循环队列
我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...
- Java数组实现循环队列的两种方法
用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...
- 数组模拟循环队列(java实现)
1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...
- 用OC基于链表实现链队列
一.简言 在前面已经用C++介绍过链队列的基本算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11692065.html.少说多做,还是上手撸代码实践一下 ...
- 深入理解循环队列----循环数组实现ArrayDeque
我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...
- 用数组实现队列(顺序队列&循环队列)
用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...
- java数据结构---循环队列
#java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...
随机推荐
- iOS----------componentsJoinedByString 和 componentsSeparatedByString 的方法的区别
将string字符串转换为array数组 NSArray *array = [Str componentsSeparatedByString:@","]; ==反向方法 将arr ...
- 微店APP协议简要分析
1.通过抓包软件charles进行抓包,点击微信收款后,抓包内容都是加密处理过 2.加载分析定位这些字段的加密函数. WDTNThorParameterProcessor HTTPBody:task ...
- deducmsV5.7 在{dede:datalist}标签中runphp无效的解决办法
问题: 后台数据是dede:datalist标签展示中,中间有isshow - 是否展示的字段,数据库里存的是0/1:我本来想用{dede:field.isshow runphp='yes'}来着,可 ...
- 8 个 Tips 让你更好的进行 Code Review
摘要: Code Review 可以提高代码质量. 原文:Elevenbeans 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 原文地址:https://kellysutton.co ...
- Liu Junqiao:工作中用到的命令以及问题汇总
工作中用到的命令以及问题汇总 2019-11-29 查看系统运行时间,这个问题是因为我们在阿里云上有个机器,在某一天发现这台机器上有的服务莫名奇妙的停了,然后排查时怀疑机器被重启过用如下如下命令查看了 ...
- 2.28秒创建一个k8s集群(非理论篇,理论自行 -- )
准备3台centos 7+ (建议7以上,不然要会很麻烦,要升级内核等等,扯淡的东西) 安装docker 和k8s集群(均以最新版为例)基于官网 设置静态ip(可选) 查看本机的网关ip cd /Li ...
- 第04组 Beta冲刺(1/4)
队名:斗地组 组长博客:地址 作业博客:Beta冲刺(1/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.分配展示任务 2.收集各个组员的进度 3.写博客 展示GitHub当日代码/文档 ...
- IT兄弟连 HTML5教程 HTML5表单 多样的输入类型1
HTML5拥有多个新的表单输入类型,这些新特性提供了更好的输入控制和验证.并不是所有的主浏览器都支持新的input类型,不过我们可以在所有的主浏览器中使用它们,即使不被支持,仍然可以显示为常规的文本域 ...
- 真正的RISC-V开发板——VEGA织女星开发板开箱评测
前言 由于最近ARM公司要求员工"停止所有与华为及其子公司正在生效的合约.支持及未决约定",即暂停与华为的相关合作,大家纷纷把注意力投向了另一个的处理器架构RISC-V,它是基于精 ...
- Swoole Redis 连接池的实现
概述 这是关于 Swoole 入门学习的第九篇文章:Swoole Redis 连接池的实现. 第八篇:Swoole MySQL 连接池的实现 第七篇:Swoole RPC 的实现 第六篇:Swoole ...