用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)进行插入操作,在 ...
随机推荐
- Iris入门操练1
选一个框架,慢慢熟悉··· 按官网文档,先走一次.. package main import ( "github.com/kataras/iris/v12" "githu ...
- Redis学习笔记(九、Redis总结)
1.Redis五大对象: 在Redis中有五大对象,分别是String.List.Hash.Set.Sorted Set. 这五大对象都有自己独特的编码方式,每个编码的实现都不一样,有自己独特的使用场 ...
- JavaScript-----7.循环
1.循环 在JS中主要有以下三种类型的循环 for循环 while循环 do...while循环 2. for循环 2.1 语法结构如下: for (初始化变量: 条件表达式: 操作表达式) { // ...
- 09. Go 语言并发
Go 语言并发 并发指在同一时间内可以执行多个任务.并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等.本章讲解的并发含义属于多线程编程. Go 语言通过编译器运行时(runtime),从 ...
- [译]Vulkan教程(31)加载模型
[译]Vulkan教程(31)加载模型 Loading models 加载模型 Introduction 入门 Your program is now ready to render textured ...
- IT兄弟连 HTML5教程 HTML5表单 新增的表单属性1
HTML5 Input表单为<form>和<input>标签添加了几个新属性,属性如表1. 1 autocomplete属性 autocomplete属性规定form或inp ...
- win7怎么使用远程桌面连接(win10类似,同样适用)
win7使用远程桌面比mac要简单多了,只需在桌面点击“开始”,找到并打开“附件”,点击“远程桌面连接”即可 mac使用远程桌面连接:https://www.cnblogs.com/tu-071 ...
- SSH框架之Struts2第二篇
1.2 知识点 1.2.1 Struts2的Servlet的API的访问 1.2.1.1 方式一 : 通过ActionContext实现 页面: <h1>Servlet的API的访问方式一 ...
- 怎么将CAD转PNG格式?这两种方法值得收藏
在从事相关CAD工作的小伙伴们都知道,CAD中不光需要绘制各种各样的图纸,还需要根据工作的需要来进行图纸格式的转换工作.那有的时候就需要将CAD转换成PNG格式的图片进行使用.那怎么将CAD转PNG格 ...
- SSM框架之spring(1)
spring(1) 1.spring概述 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP( ...