一、简言

在前面已经用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. 速查TARGET_OS关系/Apple xcode 宏定义

    记法 : 次级等于上级 TARGET_OS_WIN32 - Generated code will run under 32-bit Windows TARGET_OS_UNIX - Generate ...

  2. 「漏洞预警」Apache Flink 任意 Jar 包上传导致远程代码执行漏洞复现

    漏洞描述 Apache Flink是一个用于分布式流和批处理数据的开放源码平台.Flink的核心是一个流数据流引擎,它为数据流上的分布式计算提供数据分发.通信和容错功能.Flink在流引擎之上构建批处 ...

  3. Redis配置文件详解(redis.conf)

    # vi redis.conf   daemonize yes #是否以后台进程运行 pidfile /var/run/redis/redis-server.pid    #pid文件位置 port ...

  4. Appium(三):安装appium client、adb命令

    1. 安装appium client appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好的用例. appium client是配合原生 ...

  5. io流追加到一个文件中信息比如日志

    package com.yh.day02.arrays; import java.io.File;import java.io.FileInputStream;import java.io.FileN ...

  6. day98_12_2 数据分析工具包。

    1.numpy 在python中,数据分析可以使用numpy. 首先可以安装ipython解释器,在终端,代码变得可视化,界面有高亮显示: pip Install ipython 除了可以在终端编程之 ...

  7. #w30 2019年大前端技术周刊

    本周是2019年第30周 会议 2019年ArchSummit全球架构师峰会 2019年7月在深圳举行了ArchSummit全球架构师峰会,里面有不少关于大前端的主题可以关注. 从0到1,移动政务应用 ...

  8. ubuntu18.04 安装 flameshot截图工具

    安装flameshot:https://github.com/lupoDharkael/flameshot sudo apt-get install flameshot 然后设置一个快捷键,设置> ...

  9. C++ 面向对象程序设计复习大纲

     这是我在准备C++考试时整理的提纲,如果是通过搜索引擎搜索到这篇博客的师弟师妹,建议还是先参照PPT和课本,这个大纲也不是很准确,自己总结会更有收获,多去理解含义,不要死记硬背,否则遇到概念辨析题会 ...

  10. Linux CentOS上安装 MySQL 8.0.16

    前言: 因为我需要在我新安装的Linux CentOS系统服务器中安装和配置MySQL服务器,然而对于我们这种Linux使用小白而言在Linux系统中下载,解压,配置MySQL等一系列的操作还是有些耗 ...