一、简言

在前面已经用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. asp.net实现SQL2005的通知数据缓存

    首先第一步是确保您的 Service Broker 已经激活,激活 Service Broker (Transact-SQL)如下: USE master ; GO ALTER DATABASE Yo ...

  2. August 18th, 2019. Week 34th, Sunday

    Fear doesn't shut you down, it wakes you up. 恐惧不会消磨你的意志,它能激发你的潜能. We all know that fear is powerful, ...

  3. python与数据库交互的模块pymysql

    一.Mysql 1.前提 pip install pymysql import pymysql 2.详情 Connection对象 =====>用于连接数据库 用于建立与数据库的连接 创建对象: ...

  4. ReactNative: 使用尺寸类Dimensions获取屏幕尺寸

    一.简介 在前面创建使用组件时,虽然使用的都是伸缩盒子布局,但是很少使用宽高来进行绝对定位.在iOS中可以通过UIScreen控件获取当前屏幕的宽高,同样地,在RN中提供了一个尺寸组件Dimensio ...

  5. EEPROM的概念接口类型及软件实例

    基本概念 EEPROM的全称是“电可擦除可编程只读存储器”,即Electrically Erasable Programmable Read-Only Memory.是相对于紫外擦除的rom来讲的.但 ...

  6. IT兄弟连 HTML5教程 HTML5表单 小结及习题

    小结 HTML表单提交的方法有get方法和post方法,get方法的作用是从指定的资源请求数据,post方法的作用是向指定的资源提交要被处理的数据.HTML表单一直都是Web的核心技术之一,有了它我们 ...

  7. 关于@RequestBody 有的时候能接收有的时候接收不了的情况,@RequestParam什么时候使用

    最近有点疑惑的是,在公司用@RequestBody  可以解析前端发送的json串,但是自己在做项目的时候老是会接受不到,报415错误,于是寻思了一下,看了看请求体有何不同,发现确实不同,  这个是表 ...

  8. 案例:使用dbms_xplan.display_cursor无法获取执行计划

    案例:使用dbms_xplan.display_cursor无法获取执行计划 环境:RHEL 6.5 + Oracle 11.2.0.4 在一次测试中发现使用dbms_xplan.display_cu ...

  9. dataTable 表插入新行

    DataRow dr = dt.NewRow();//定义新行            dr["sumPrice"] = sumPrice;//对应字段赋值            d ...

  10. zookeeper的java问题

    执行bash ./bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /data/zookeeper-3.4.9/b ...