一、简言

在前面已经用C++介绍过链队列的基本算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11692065.html。少说多做,还是上手撸代码实践一下才能更好的加深理解,本文采用OC面向对象的思想来实现一个链队列。

二、代码

Node

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Node : NSObject
@property (nonatomic, assign) int data;
@property (nonatomic, strong, nullable) Node *next;
-(instancetype)initWithData:(int)data;
@end NS_ASSUME_NONNULL_END
#import "Node.h"

@implementation Node

-(instancetype)initWithData:(int)data {
self = [super init];
if (self) {
self.data = data;
self.next = nil;
}
return self;
} @end

LinkQueue

//
// LinkQueue.h
// 运行时
//
// Created by 夏远全 on 2019/10/19.
// #import <Foundation/Foundation.h>
#import "Node.h" NS_ASSUME_NONNULL_BEGIN @interface LinkQueue : NSObject /**
构造一个链队列
@return 队列
*/
+(instancetype)constrcutLinkQueue; /**
入队列
@param node 节点元素
*/
-(void)enQueueWithNode:(Node *)node; /**
出队列
@return 节点元素
*/
-(Node *)deQueue; /**
队列是否为空
@return 布尔值
*/
-(BOOL)isEmpty; /**
获取元素个数
@return 个数
*/
-(int)eleCount; @end NS_ASSUME_NONNULL_END
//
// LinkQueue.m
// 运行时
//
// Created by 夏远全 on 2019/10/19.
// #import "LinkQueue.h" @interface LinkQueue()
@property (nonatomic, strong) Node *front; //队列头指针
@property (nonatomic, strong) Node *rear; //队列尾指针
@end @implementation LinkQueue /**
构造一个链队列
@return 队列
*/
+(instancetype)constrcutLinkQueue { LinkQueue *linkQueue = [[LinkQueue alloc] init];
Node *headNode = [[Node alloc] init]; //便于操作,创建一个头结点
linkQueue.front = linkQueue.rear = headNode; //均指向头结点 return linkQueue;
} /**
入队列
@param node 节点元素
*/
-(void)enQueueWithNode:(Node *)node { /// 尾节点的next指针指向新节点
self.rear.next = node; /// 更改尾指针指向新节点
self.rear = node; NSLog(@"入队列的元素 = %d",node.data);
} /**
出队列
@return 节点元素
*/
-(Node *)deQueue { if ([self isEmpty]) {
return nil;
} ///取出头结点的指向的首节点
Node *node = self.front.next; ///更改头结点指针指向首节点的下一个节点
self.front.next = node.next; ///判断取出的节点是否为尾指针指向的节点,如果是,队列元素则全部取完,此时将首尾指针均重新指向头结点
if (self.rear == node) {
self.rear = self.front;
} NSLog(@"出队列的元素 = %d",node.data); return node;
} /**
队列是否为空
@return 布尔值
*/
-(BOOL)isEmpty {
if (self.front == self.rear) {
NSLog(@"当前队列已空");
return YES;
}
return NO;
} /**
获取元素个数
@return 个数
*/
-(int)eleCount {
if (self.front == self.rear) {
NSLog(@"当前队列元素个数 = 0");
return ;
}
Node *p = self.front.next;
int eleCount = ;
while (p) {
eleCount ++;
p = p.next;
}
NSLog(@"当前队列元素个数 = %d",eleCount);
return eleCount;
} @end

三、结果

测试:

-(void)test_DataStructure_LinkQueue {

    ///构造链式队列
LinkQueue *linkQueue = [LinkQueue constrcutLinkQueue]; /// 构造元素
Node *node1 = [[Node alloc] initWithData:];
Node *node2 = [[Node alloc] initWithData:];
Node *node3 = [[Node alloc] initWithData:];
Node *node4 = [[Node alloc] initWithData:];
Node *node5 = [[Node alloc] initWithData:]; /// enter Queue 入队列
[linkQueue enQueueWithNode:node1];
[linkQueue enQueueWithNode:node2];
[linkQueue enQueueWithNode:node3];
[linkQueue enQueueWithNode:node4];
[linkQueue enQueueWithNode:node5]; ///全部入队后 get eleCount 元素个数
[linkQueue eleCount]; /// deque Queue 出队列
[linkQueue deQueue];
[linkQueue deQueue];
[linkQueue deQueue];
[linkQueue deQueue];
[linkQueue deQueue];
[linkQueue deQueue]; ///全部出队后 get eleCount 元素个数
[linkQueue eleCount];
}

 打印:

-- ::36.278796+ 运行时[:] 入队列的元素 =
-- ::36.278991+ 运行时[:] 入队列的元素 =
-- ::36.279105+ 运行时[:] 入队列的元素 =
-- ::36.279201+ 运行时[:] 入队列的元素 =
-- ::36.279289+ 运行时[:] 入队列的元素 =
-- ::36.279405+ 运行时[:] 当前队列元素个数 =
-- ::36.279493+ 运行时[:] 出队列的元素 =
-- ::36.279584+ 运行时[:] 出队列的元素 =
-- ::36.279665+ 运行时[:] 出队列的元素 =
-- ::36.279869+ 运行时[:] 出队列的元素 =
-- ::36.280227+ 运行时[:] 出队列的元素 =
-- ::36.280548+ 运行时[:] 当前队列已空
-- ::36.280845+ 运行时[:] 当前队列元素个数 =

用OC基于链表实现链队列的更多相关文章

  1. 用OC基于数组实现循环队列

    一.简言 使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式).在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnbl ...

  2. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  3. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  4. 基于python实现链式队列代码

    """ 链式存储-队列 linkqueue.py 代码实现 思路: 1.入队, 2.出队, 3.判断空满 """ # 异常类 class Q ...

  5. 基于visual Studio2013解决算法导论之022队列实现(基于链表)

     题目 基于链表的队列实现 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  6. 阻塞队列 - java基于链表的简单实现

    1.阻塞队列的原理 阻塞队列与普通队列的区别在于:阻塞队列为空时,从队列中获取元素的操作将会被阻塞,当队列为满时,往队列里添加元素的操作会被阻塞. 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其 ...

  7. java与数据结构(8)---java实现链队列

    链队列 实际上就是单链表,只是规定了删除在队头进行,添加在队尾进行. 链队列代码结构 package list.queue; public interface Queuable<T>; p ...

  8. 链队列之C++实现

    链队列时建立在单链表的基础之上的.由于是动态分配节点内存,所以无需判满. 链队列的形式如下: 1.队列空 2.队列存在数据 下面介绍下C++实现的链队列,VC6下调试通过. 1.文件组织 2.lq.h ...

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

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

随机推荐

  1. dedecmsV5.7 任意文件上传漏洞修复

    问题文件:在/include/dialog/select_soft_post.php文件 解决方法: 先找到这个文件/include/dialog/select_soft_post.php,找到大概7 ...

  2. 【Beta阶段】第十二周Scrum会议

    [Beta阶段]第十二周Scrum会议 本次会议为第十二周第一次Scrum Meeting,会议对Beta阶段工作进行了总结,针对Beta阶段还未完成的问题进行了讨论. 会议时间为2019.12.3. ...

  3. 使用Active Database Duplication创建跨平台Data Guard设置 (Windows/Linux) (Doc ID 881421.1)

    Using Active Database Duplication to Create Cross Platform Data Guard Setup (Windows/Linux) (Doc ID ...

  4. 编译原理:直接推导、间接推导、n次推导、规范推导

    直接推导,直接运用规则进行的推导 间接推导.n次推导 有两种符号 第一种是,表示多次运用直接推导 第二种是,表示零次或多次运用直接推导 n表示中间的步骤数 规范推导 其实就是最右推导

  5. layui多个时间选择器出现闪退问题

    1.出现问题的代码 laydate.render({ elem: '#startDate' // }); laydate.render({ elem: '#endDate' // }); laydat ...

  6. 菜鸟刷面试题(一、Java基础篇)

    目录: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什 ...

  7. C语言程序设计100例之(19):欢乐的跳

    例19   欢乐的跳 题目描述 一个n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数,则称之符合“欢乐的跳”,如数组1 4 2 3符合“欢乐的跳”,因为差的绝对 ...

  8. Linux查看CPU和内存情况

    本文简单介绍在Linux上查看CPU和内存情况和一款系统资源查看工具htop. 查看CPU情况 以下是个人工作会经常使用到的服务器的信息. 查看所有CPU信息 可以通过如下命令查看所有CPU信息: # ...

  9. 利用百度文字识别API识别图像中的文字

      本文将会介绍如何使用百度AI开放平台中的文字识别服务来识别图片中的文字.百度AI开放平台的访问网址为:http://ai.baidu.com/ ,为了能够使用该平台提供的AI服务,你需要事先注册一 ...

  10. sql server多表关联update

    一般都是写的单表update语句,很少写多表关联的update,但是事实上,在SQL Server中,update的多表连接更新和select的多表连接查询在使用的方法上其实并没有多大区别. 直接上一 ...