一、简言

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

二、代码

Node

  1. #import <Foundation/Foundation.h>
  2.  
  3. NS_ASSUME_NONNULL_BEGIN
  4.  
  5. @interface Node : NSObject
  6. @property (nonatomic, assign) int data;
  7. @property (nonatomic, strong, nullable) Node *next;
  8. -(instancetype)initWithData:(int)data;
  9. @end
  10.  
  11. NS_ASSUME_NONNULL_END
  1. #import "Node.h"
  2.  
  3. @implementation Node
  4.  
  5. -(instancetype)initWithData:(int)data {
  6. self = [super init];
  7. if (self) {
  8. self.data = data;
  9. self.next = nil;
  10. }
  11. return self;
  12. }
  13.  
  14. @end

LinkQueue

  1. //
  2. // LinkQueue.h
  3. // 运行时
  4. //
  5. // Created by 夏远全 on 2019/10/19.
  6. //
  7.  
  8. #import <Foundation/Foundation.h>
  9. #import "Node.h"
  10.  
  11. NS_ASSUME_NONNULL_BEGIN
  12.  
  13. @interface LinkQueue : NSObject
  14.  
  15. /**
  16. 构造一个链队列
  17. @return 队列
  18. */
  19. +(instancetype)constrcutLinkQueue;
  20.  
  21. /**
  22. 入队列
  23. @param node 节点元素
  24. */
  25. -(void)enQueueWithNode:(Node *)node;
  26.  
  27. /**
  28. 出队列
  29. @return 节点元素
  30. */
  31. -(Node *)deQueue;
  32.  
  33. /**
  34. 队列是否为空
  35. @return 布尔值
  36. */
  37. -(BOOL)isEmpty;
  38.  
  39. /**
  40. 获取元素个数
  41. @return 个数
  42. */
  43. -(int)eleCount;
  44.  
  45. @end
  46.  
  47. NS_ASSUME_NONNULL_END
  1. //
  2. // LinkQueue.m
  3. // 运行时
  4. //
  5. // Created by 夏远全 on 2019/10/19.
  6. //
  7.  
  8. #import "LinkQueue.h"
  9.  
  10. @interface LinkQueue()
  11. @property (nonatomic, strong) Node *front; //队列头指针
  12. @property (nonatomic, strong) Node *rear; //队列尾指针
  13. @end
  14.  
  15. @implementation LinkQueue
  16.  
  17. /**
  18. 构造一个链队列
  19. @return 队列
  20. */
  21. +(instancetype)constrcutLinkQueue {
  22.  
  23. LinkQueue *linkQueue = [[LinkQueue alloc] init];
  24. Node *headNode = [[Node alloc] init]; //便于操作,创建一个头结点
  25. linkQueue.front = linkQueue.rear = headNode; //均指向头结点
  26.  
  27. return linkQueue;
  28. }
  29.  
  30. /**
  31. 入队列
  32. @param node 节点元素
  33. */
  34. -(void)enQueueWithNode:(Node *)node {
  35.  
  36. /// 尾节点的next指针指向新节点
  37. self.rear.next = node;
  38.  
  39. /// 更改尾指针指向新节点
  40. self.rear = node;
  41.  
  42. NSLog(@"入队列的元素 = %d",node.data);
  43. }
  44.  
  45. /**
  46. 出队列
  47. @return 节点元素
  48. */
  49. -(Node *)deQueue {
  50.  
  51. if ([self isEmpty]) {
  52. return nil;
  53. }
  54.  
  55. ///取出头结点的指向的首节点
  56. Node *node = self.front.next;
  57.  
  58. ///更改头结点指针指向首节点的下一个节点
  59. self.front.next = node.next;
  60.  
  61. ///判断取出的节点是否为尾指针指向的节点,如果是,队列元素则全部取完,此时将首尾指针均重新指向头结点
  62. if (self.rear == node) {
  63. self.rear = self.front;
  64. }
  65.  
  66. NSLog(@"出队列的元素 = %d",node.data);
  67.  
  68. return node;
  69. }
  70.  
  71. /**
  72. 队列是否为空
  73. @return 布尔值
  74. */
  75. -(BOOL)isEmpty {
  76. if (self.front == self.rear) {
  77. NSLog(@"当前队列已空");
  78. return YES;
  79. }
  80. return NO;
  81. }
  82.  
  83. /**
  84. 获取元素个数
  85. @return 个数
  86. */
  87. -(int)eleCount {
  88. if (self.front == self.rear) {
  89. NSLog(@"当前队列元素个数 = 0");
  90. return ;
  91. }
  92. Node *p = self.front.next;
  93. int eleCount = ;
  94. while (p) {
  95. eleCount ++;
  96. p = p.next;
  97. }
  98. NSLog(@"当前队列元素个数 = %d",eleCount);
  99. return eleCount;
  100. }
  101.  
  102. @end

三、结果

测试:

  1. -(void)test_DataStructure_LinkQueue {
  2.  
  3. ///构造链式队列
  4. LinkQueue *linkQueue = [LinkQueue constrcutLinkQueue];
  5.  
  6. /// 构造元素
  7. Node *node1 = [[Node alloc] initWithData:];
  8. Node *node2 = [[Node alloc] initWithData:];
  9. Node *node3 = [[Node alloc] initWithData:];
  10. Node *node4 = [[Node alloc] initWithData:];
  11. Node *node5 = [[Node alloc] initWithData:];
  12.  
  13. /// enter Queue 入队列
  14. [linkQueue enQueueWithNode:node1];
  15. [linkQueue enQueueWithNode:node2];
  16. [linkQueue enQueueWithNode:node3];
  17. [linkQueue enQueueWithNode:node4];
  18. [linkQueue enQueueWithNode:node5];
  19.  
  20. ///全部入队后 get eleCount 元素个数
  21. [linkQueue eleCount];
  22.  
  23. /// deque Queue 出队列
  24. [linkQueue deQueue];
  25. [linkQueue deQueue];
  26. [linkQueue deQueue];
  27. [linkQueue deQueue];
  28. [linkQueue deQueue];
  29. [linkQueue deQueue];
  30.  
  31. ///全部出队后 get eleCount 元素个数
  32. [linkQueue eleCount];
  33. }

 打印:

  1. -- ::36.278796+ 运行时[:] 入队列的元素 =
  2. -- ::36.278991+ 运行时[:] 入队列的元素 =
  3. -- ::36.279105+ 运行时[:] 入队列的元素 =
  4. -- ::36.279201+ 运行时[:] 入队列的元素 =
  5. -- ::36.279289+ 运行时[:] 入队列的元素 =
  6. -- ::36.279405+ 运行时[:] 当前队列元素个数 =
  7. -- ::36.279493+ 运行时[:] 出队列的元素 =
  8. -- ::36.279584+ 运行时[:] 出队列的元素 =
  9. -- ::36.279665+ 运行时[:] 出队列的元素 =
  10. -- ::36.279869+ 运行时[:] 出队列的元素 =
  11. -- ::36.280227+ 运行时[:] 出队列的元素 =
  12. -- ::36.280548+ 运行时[:] 当前队列已空
  13. -- ::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. Iris入门操练1

    选一个框架,慢慢熟悉··· 按官网文档,先走一次.. package main import ( "github.com/kataras/iris/v12" "githu ...

  2. Redis学习笔记(九、Redis总结)

    1.Redis五大对象: 在Redis中有五大对象,分别是String.List.Hash.Set.Sorted Set. 这五大对象都有自己独特的编码方式,每个编码的实现都不一样,有自己独特的使用场 ...

  3. JavaScript-----7.循环

    1.循环 在JS中主要有以下三种类型的循环 for循环 while循环 do...while循环 2. for循环 2.1 语法结构如下: for (初始化变量: 条件表达式: 操作表达式) { // ...

  4. 09. Go 语言并发

    Go 语言并发 并发指在同一时间内可以执行多个任务.并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等.本章讲解的并发含义属于多线程编程. Go 语言通过编译器运行时(runtime),从 ...

  5. [译]Vulkan教程(31)加载模型

    [译]Vulkan教程(31)加载模型 Loading models 加载模型 Introduction 入门 Your program is now ready to render textured ...

  6. IT兄弟连 HTML5教程 HTML5表单 新增的表单属性1

    HTML5 Input表单为<form>和<input>标签添加了几个新属性,属性如表1. 1  autocomplete属性 autocomplete属性规定form或inp ...

  7. win7怎么使用远程桌面连接(win10类似,同样适用)

     win7使用远程桌面比mac要简单多了,只需在桌面点击“开始”,找到并打开“附件”,点击“远程桌面连接”即可   mac使用远程桌面连接:https://www.cnblogs.com/tu-071 ...

  8. SSH框架之Struts2第二篇

    1.2 知识点 1.2.1 Struts2的Servlet的API的访问 1.2.1.1 方式一 : 通过ActionContext实现 页面: <h1>Servlet的API的访问方式一 ...

  9. 怎么将CAD转PNG格式?这两种方法值得收藏

    在从事相关CAD工作的小伙伴们都知道,CAD中不光需要绘制各种各样的图纸,还需要根据工作的需要来进行图纸格式的转换工作.那有的时候就需要将CAD转换成PNG格式的图片进行使用.那怎么将CAD转PNG格 ...

  10. SSM框架之spring(1)

    spring(1) 1.spring概述 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP( ...