用OC基于链表实现链队列
一、简言
在前面已经用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基于链表实现链队列的更多相关文章
- 用OC基于数组实现循环队列
一.简言 使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式).在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnbl ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- 基于python实现链式队列代码
""" 链式存储-队列 linkqueue.py 代码实现 思路: 1.入队, 2.出队, 3.判断空满 """ # 异常类 class Q ...
- 基于visual Studio2013解决算法导论之022队列实现(基于链表)
题目 基于链表的队列实现 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...
- 阻塞队列 - java基于链表的简单实现
1.阻塞队列的原理 阻塞队列与普通队列的区别在于:阻塞队列为空时,从队列中获取元素的操作将会被阻塞,当队列为满时,往队列里添加元素的操作会被阻塞. 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其 ...
- java与数据结构(8)---java实现链队列
链队列 实际上就是单链表,只是规定了删除在队头进行,添加在队尾进行. 链队列代码结构 package list.queue; public interface Queuable<T>; p ...
- 链队列之C++实现
链队列时建立在单链表的基础之上的.由于是动态分配节点内存,所以无需判满. 链队列的形式如下: 1.队列空 2.队列存在数据 下面介绍下C++实现的链队列,VC6下调试通过. 1.文件组织 2.lq.h ...
- 教你如何使用Java手写一个基于数组实现的队列
一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...
随机推荐
- 速查TARGET_OS关系/Apple xcode 宏定义
记法 : 次级等于上级 TARGET_OS_WIN32 - Generated code will run under 32-bit Windows TARGET_OS_UNIX - Generate ...
- 「漏洞预警」Apache Flink 任意 Jar 包上传导致远程代码执行漏洞复现
漏洞描述 Apache Flink是一个用于分布式流和批处理数据的开放源码平台.Flink的核心是一个流数据流引擎,它为数据流上的分布式计算提供数据分发.通信和容错功能.Flink在流引擎之上构建批处 ...
- Redis配置文件详解(redis.conf)
# vi redis.conf daemonize yes #是否以后台进程运行 pidfile /var/run/redis/redis-server.pid #pid文件位置 port ...
- Appium(三):安装appium client、adb命令
1. 安装appium client appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好的用例. appium client是配合原生 ...
- io流追加到一个文件中信息比如日志
package com.yh.day02.arrays; import java.io.File;import java.io.FileInputStream;import java.io.FileN ...
- day98_12_2 数据分析工具包。
1.numpy 在python中,数据分析可以使用numpy. 首先可以安装ipython解释器,在终端,代码变得可视化,界面有高亮显示: pip Install ipython 除了可以在终端编程之 ...
- #w30 2019年大前端技术周刊
本周是2019年第30周 会议 2019年ArchSummit全球架构师峰会 2019年7月在深圳举行了ArchSummit全球架构师峰会,里面有不少关于大前端的主题可以关注. 从0到1,移动政务应用 ...
- ubuntu18.04 安装 flameshot截图工具
安装flameshot:https://github.com/lupoDharkael/flameshot sudo apt-get install flameshot 然后设置一个快捷键,设置> ...
- C++ 面向对象程序设计复习大纲
这是我在准备C++考试时整理的提纲,如果是通过搜索引擎搜索到这篇博客的师弟师妹,建议还是先参照PPT和课本,这个大纲也不是很准确,自己总结会更有收获,多去理解含义,不要死记硬背,否则遇到概念辨析题会 ...
- Linux CentOS上安装 MySQL 8.0.16
前言: 因为我需要在我新安装的Linux CentOS系统服务器中安装和配置MySQL服务器,然而对于我们这种Linux使用小白而言在Linux系统中下载,解压,配置MySQL等一系列的操作还是有些耗 ...