用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)进行插入操作,在 ...
随机推荐
- 卡拉OK歌词原理和实现高仿Android网易云音乐
大家好,我们是爱学啊,继上一篇讲解了[LRC歌词原理和实现高仿Android网易云音乐],今天给大家带来一篇关于卡拉OK歌词原理和在Android上如何实现歌词逐字滚动的效果,本文来自[Android ...
- 【Gradle】Android Gradle 多渠道构建
Android Gradle 多渠道构建 多渠道构建的基本原理 在Android Gradle中,定义了一个叫Build Variant的概念,一个Build Variant=Build TYpe+P ...
- ansible执行带有环境变量的脚本不生效
1背景 jenkins发布时,使用ansible执行远程主机上的启动tomcat脚本发现不生效,启动tomcat的脚本中有环境变量. ansible主机为:172.16.35.8 tomcat服务器为 ...
- Ubuntu18.04 下最好用的gif录制工具peek
最近在写代码,需要找一个ubuntu下的录制屏幕工具,尝试了几个,发现peek是最好用的.这里就给大家推荐一下. 一 安装: 该软件是一个在gihtub上的开源软件,源码路径: https://git ...
- c++ LeetCode(初级数组篇)十一道算法例题代码详解(一)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10940636.html 唉!最近忙着面试找实习,然后都是面试的很多是leetcode的算法题, ...
- css盒子布局,浮动布局以及显影与简单的动画
08.05自我总结 一.盒子布局 1.盒子布局的组成 margin border padding content 2.margin margin是外边距,控制盒子的显示位置相对于他的上一级 left. ...
- JavaWeb问题记录——SessionIdGeneratorBase.createSecureRandom
JavaWeb问题记录——SessionIdGeneratorBase.createSecureRandom 摘要:本文主要记录了在启动Tomcat时,出现的一个警告以及解决办法. 部分内容来自以下博 ...
- Python语法易错点
列表.数组赋值 a = [1,6] b = a * 2 b[0] = -9999 print(a) print(b) [1, 6] [-9999, 6, 1, 6] a = [1,6] b = a b ...
- javaWeb核心技术第十三篇之Ajax
Js--ajax--原理解释 概述:异步刷新网页,不会刷新整个页面. Get原理: <%@ page language="java" contentType="te ...
- ABP学习资源
Abp翻译文档:https://github.com/ABPFrameWorkGroup/AbpDocument2Chinese ABP官网:https://aspnetboilerplate.com ...