• 用OC基于数组实现循环队列


    一、简言

    使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式)。在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11700048.html。光说不练嘴把式,现在本文使用OC面向对象的思想来实现一下。

     

    二、代码

    ArrayQueue

    //
    //  ArrayQueue.h
    //  运行时
    //
    //  Created by 夏远全 on 2019/10/19.
    //
    
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface ArrayQueue : NSObject
    
    /**
     构造一个循环队列
     @param capacity 队列容量
     @return 队列
     */
    +(instancetype)constrcutArrayQueueWithCapacity:(int)capacity;
    
    
    /**
     入队列
     @param element 元素
     */
    -(void)enQueueWithElement:(id)element;
    
    
    /**
     出队列
     @return 元素
     */
    -(id)deQueueElement;
    
    
    /**
     队列是否为空
     @return 布尔值
     */
    -(BOOL)isEmpty;
    
    /**
     队列是否已满
     @return 布尔值
     */
    -(BOOL)isFull;
    
    /**
     获取元素个数
     @return 个数
     */
    -(int)eleCount;
    
    @end
    
    NS_ASSUME_NONNULL_END
    //
    //  ArrayQueue.m
    //  运行时
    //
    //  Created by 夏远全 on 2019/10/19.
    //
    
    #import "ArrayQueue.h"
    
    @interface ArrayQueue ()
    @property (nonatomic, strong) NSMutableArray *array;
    @property (nonatomic, assign) int     front;
    @property (nonatomic, assign) int     rear;
    @property (nonatomic, assign) int     capacity;
    @end
    
    @implementation ArrayQueue
    
    /**
     构造一个循环队列
     @param capacity 队列容量
     @return 队列
     */
    +(instancetype)constrcutArrayQueueWithCapacity:(int)capacity {
        
        ///断言一下
        assert(capacity>0);
        
        ArrayQueue *arrayQueue = [[ArrayQueue alloc] init];
        arrayQueue.array = [NSMutableArray array]; //初始化容器
        arrayQueue.capacity = capacity;            //初始化容量
        arrayQueue.front = arrayQueue.rear = 0;    //初始化首尾指针
        return arrayQueue;
    }
    
    
    /**
     入队列
     @param element 元素
     */
    -(void)enQueueWithElement:(id)element {
        
        ///判断队列是否已满
        if ([self isFull]) {
            NSLog(@"队列已满,元素%@不能被入列, front = %d , rear = %d", element, self.front, self.rear);
            return;
        }
        
        ///插入新元素
        self.array[self.rear] = element;
        
        ///更新队尾指针
        self.rear  = (self.rear + 1) % self.capacity;
        
        NSLog(@"入队列的元素 = %@, front = %d , rear = %d", element, self.front, self.rear);
    }
    
    
    /**
     出队列
     @return 元素
     */
    -(id)deQueueElement {
        
        ///判断队列是否已空
        if ([self isEmpty]) {
            NSLog(@"队列已空, front = %d , rear = %d", self.front, self.rear);
            return nil;
        }
        
        ///取出队头的元素
        id element = self.array[self.front];
        
        ///更新队头指针
        self.front = (self.front + 1) % self.capacity;
        
        NSLog(@"出队列的元素 = %@, front = %d , rear = %d", element, self.front, self.rear);
        
        return element;
    }
    
    
    /**
     队列是否为空
     @return 布尔值
     */
    -(BOOL)isEmpty {
        
        if (self.front == self.rear) {
            return YES;
        }
        return NO;
    }
    
    
    /**
     队列是否已满
     @return 布尔值
     */
    -(BOOL)isFull {
        
        if (self.front == (self.rear + 1) % self.capacity) {
            return YES;
        }
        return NO;
    }
    
    /**
     获取元素个数
     @return 个数
     */
    -(int)eleCount {
        
        int eleCount = (self.rear - self.front + self.capacity) % self.capacity;
        NSLog(@"队列元素个数 = %d", eleCount);
        return eleCount;
    }
    
    @end

    三、结果

    测试

    -(void)test_DataStructure_ArrayQueue {
        
        /// 构造循环队列
        ArrayQueue *arrayQueue = [ArrayQueue constrcutArrayQueueWithCapacity:5];
        
        /// enter Queue 入队列
        [arrayQueue enQueueWithElement:@(10)];
        [arrayQueue enQueueWithElement:@(30)];
        [arrayQueue enQueueWithElement:@(50)];
        [arrayQueue enQueueWithElement:@(80)];
        [arrayQueue enQueueWithElement:@(100)];
        
        /// 全部入队后 get eleCount 元素个数
        [arrayQueue eleCount];
        
        /// deque Queue 出队列
        [arrayQueue deQueueElement];
        [arrayQueue deQueueElement];
        [arrayQueue deQueueElement];
        [arrayQueue deQueueElement];
        [arrayQueue deQueueElement];
        
        /// 全部出队后  get eleCount 元素个数
        [arrayQueue eleCount];
        
    }

    打印

    2019-10-19 15:20:57.323138+0800 运行时[76006:2342668] 入队列的元素 = 10, front = 0 , rear = 1
    2019-10-19 15:20:57.323314+0800 运行时[76006:2342668] 入队列的元素 = 30, front = 0 , rear = 2
    2019-10-19 15:20:57.323435+0800 运行时[76006:2342668] 入队列的元素 = 50, front = 0 , rear = 3
    2019-10-19 15:20:57.323544+0800 运行时[76006:2342668] 入队列的元素 = 80, front = 0 , rear = 4
    2019-10-19 15:20:57.323639+0800 运行时[76006:2342668] 队列已满,元素100不能被入列, front = 0 , rear = 4
    2019-10-19 15:20:57.323721+0800 运行时[76006:2342668] 队列元素个数 = 4
    2019-10-19 15:20:57.323844+0800 运行时[76006:2342668] 出队列的元素 = 10, front = 1 , rear = 4
    2019-10-19 15:20:57.323945+0800 运行时[76006:2342668] 出队列的元素 = 30, front = 2 , rear = 4
    2019-10-19 15:20:57.324033+0800 运行时[76006:2342668] 出队列的元素 = 50, front = 3 , rear = 4
    2019-10-19 15:20:57.324140+0800 运行时[76006:2342668] 出队列的元素 = 80, front = 4 , rear = 4
    2019-10-19 15:20:57.324245+0800 运行时[76006:2342668] 队列已空, front = 4 , rear = 4
    2019-10-19 15:20:57.324344+0800 运行时[76006:2342668] 队列元素个数 = 0
  • 相关阅读:
    Linux 使用 ssh 命令远程连接另一台 Linux
    高并发连接导致打开文件过多:java.io.IOException: Too many open files 解决方法
    WEB安全:Tomcat 只可通过域名访问,禁止通过 IP 访问
    Jmeter
    CentOS 7 开启 SNMP 实现服务器性能监控
    SSM框架、Druid连接池实现多数据源配置(已上线使用)
    Tomcat 服务器安装 SSL证书,实现 HTTP 自动跳转 HTTPS
    java操作远程共享目录
    jobss目录结构
    oracle中if/else的三种实现方式
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/11704039.html
Copyright © 2020-2023  润新知