用OC基于数组实现循环队列
时间:2019-10-19
本文章向大家介绍用OC基于数组实现循环队列,主要包括用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>0); ArrayQueue *arrayQueue = [[ArrayQueue alloc] init]; arrayQueue.array = [NSMutableArray array]; //初始化容器 arrayQueue.capacity = capacity; //初始化容量 arrayQueue.front = arrayQueue.rear = 0; //初始化首尾指针 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 + 1) % 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 + 1) % 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 + 1) % 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:5]; /// enter Queue 入队列 [arrayQueue enQueueWithElement:@(10)]; [arrayQueue enQueueWithElement:@(30)]; [arrayQueue enQueueWithElement:@(50)]; [arrayQueue enQueueWithElement:@(80)]; [arrayQueue enQueueWithElement:@(100)]; /// 全部入队后 get eleCount 元素个数 [arrayQueue eleCount]; /// deque Queue 出队列 [arrayQueue deQueueElement]; [arrayQueue deQueueElement]; [arrayQueue deQueueElement]; [arrayQueue deQueueElement]; [arrayQueue deQueueElement]; /// 全部出队后 get eleCount 元素个数 [arrayQueue eleCount]; }
打印
2019-10-19 15:20:57.323138+0800 运行时[76006:2342668] 入队列的元素 = 10, front = 0 , rear = 1 2019-10-19 15:20:57.323314+0800 运行时[76006:2342668] 入队列的元素 = 30, front = 0 , rear = 2 2019-10-19 15:20:57.323435+0800 运行时[76006:2342668] 入队列的元素 = 50, front = 0 , rear = 3 2019-10-19 15:20:57.323544+0800 运行时[76006:2342668] 入队列的元素 = 80, front = 0 , rear = 4 2019-10-19 15:20:57.323639+0800 运行时[76006:2342668] 队列已满,元素100不能被入列, front = 0 , rear = 4 2019-10-19 15:20:57.323721+0800 运行时[76006:2342668] 队列元素个数 = 4 2019-10-19 15:20:57.323844+0800 运行时[76006:2342668] 出队列的元素 = 10, front = 1 , rear = 4 2019-10-19 15:20:57.323945+0800 运行时[76006:2342668] 出队列的元素 = 30, front = 2 , rear = 4 2019-10-19 15:20:57.324033+0800 运行时[76006:2342668] 出队列的元素 = 50, front = 3 , rear = 4 2019-10-19 15:20:57.324140+0800 运行时[76006:2342668] 出队列的元素 = 80, front = 4 , rear = 4 2019-10-19 15:20:57.324245+0800 运行时[76006:2342668] 队列已空, front = 4 , rear = 4 2019-10-19 15:20:57.324344+0800 运行时[76006:2342668] 队列元素个数 = 0
原文地址:https://www.cnblogs.com/XYQ-208910/p/11704039.html
- 常见Web源码泄露总结
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
- ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
- 【weakfilescan】敏感文件扫描工具
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
- CVE-2017-11882漏洞复现
- ASP.NET Core使用静态文件、目录游览与MIME类型管理
- Python 黑客——使用Python破解门禁系统
- ASP.NET Core文件上传与下载(多种上传方式)
- 采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)
- eclipse中运行hbase时不能显示表中的值
- 从 PHP 到 Java
- 用Lua定制Redis命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RTSP协议网络摄像头网页无插件直播平台EasyNVR的云端综合管理平台EasyNVS提交基础配置报错原因分析
- 10.深入k8s:调度的优先级及抢占机制源码分析
- redis
- synchronized底层是怎么实现的?
- RSA
- Syncd - 开源自动化部署工具
- pointer-events:none禁用鼠标事件
- TiCDC 首个 GA 版本发布,特性与场景全揭秘
- Linux远程ssh执行命令expect使用及几种方法
- 数据结构--线性表和链表的基础知识
- Salesforce LWC学习(二十五) Jest Test
- 自建npm包-搭建,打包,调试,发布
- 你对排序算法了解多少
- 【大数据架构】大数据数据仓库与数据中台架构
- JavaScript中的内置对象、面向对象与原型