一、简言
在前面已经用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 0; } Node *p = self.front.next; int eleCount = 0; 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:1]; Node *node2 = [[Node alloc] initWithData:2]; Node *node3 = [[Node alloc] initWithData:3]; Node *node4 = [[Node alloc] initWithData:4]; Node *node5 = [[Node alloc] initWithData:5]; /// 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]; }
打印:
2019-10-19 14:27:36.278796+0800 运行时[74840:2307484] 入队列的元素 = 1 2019-10-19 14:27:36.278991+0800 运行时[74840:2307484] 入队列的元素 = 2 2019-10-19 14:27:36.279105+0800 运行时[74840:2307484] 入队列的元素 = 3 2019-10-19 14:27:36.279201+0800 运行时[74840:2307484] 入队列的元素 = 4 2019-10-19 14:27:36.279289+0800 运行时[74840:2307484] 入队列的元素 = 5 2019-10-19 14:27:36.279405+0800 运行时[74840:2307484] 当前队列元素个数 = 5 2019-10-19 14:27:36.279493+0800 运行时[74840:2307484] 出队列的元素 = 1 2019-10-19 14:27:36.279584+0800 运行时[74840:2307484] 出队列的元素 = 2 2019-10-19 14:27:36.279665+0800 运行时[74840:2307484] 出队列的元素 = 3 2019-10-19 14:27:36.279869+0800 运行时[74840:2307484] 出队列的元素 = 4 2019-10-19 14:27:36.280227+0800 运行时[74840:2307484] 出队列的元素 = 5 2019-10-19 14:27:36.280548+0800 运行时[74840:2307484] 当前队列已空 2019-10-19 14:27:36.280845+0800 运行时[74840:2307484] 当前队列元素个数 = 0