06-iOS实现队列以及用Stack模拟队列

队列知识小了解

队列是一种特殊的线性表,只能头尾两端进行操作。

  • 队尾:只能从队尾添加元素,一般叫做enQueue入队
  • 队头:只能从队头删除元素,一般叫做deQueue出队
  • 先进先出的原则。 在这里插入图片描述

队列一般可以设计的接口方法

根据对象的特性,可以设计出以下的接口:

元素的数量
队列是否为空
入队
出队
获取队列的头元素
清空

实现接口的思路,可以用数组或者双向链表都可以。一般优先使用双向链表,目前先用数组的,有时间的话,在用双向链表实现吧。

代码实现如下

  • 自定义一个头文件,如下:
@interface YZQueue : NSObject

//获取元素的数量
- (NSInteger)size;
//队列是否为空
- (BOOL)isEmpty;
//入队
- (void)enterQueue:(id)value;
//出队
- (id)deQueue;
//获取对象的头元素
- (id)front;

@end
  • 实现上述的方法声明:

#import "YZQueue.h"

@interface YZQueue ()

@property (nonatomic, strong) NSMutableArray *array;

@end

@implementation YZQueue

- (NSInteger)size {
    return self.array.count;
}

- (BOOL)isEmpty {
    return self.array.count == 0 ;
}

//入队
- (void)enterQueue:(id)value {
    [self.array addObject:value];
}

//出队
- (id)deQueue {
    if (self.isEmpty) {
        return nil;
    }
    id value = self.array.firstObject;
    [self.array removeObject:value];
    return value;
}

//获取对象的头元素
- (id)front {
    return self.array.firstObject;
}


#pragma mark - 懒加载
- (NSMutableArray *)array {
    if (!_array) {
        _array = [NSMutableArray array];
    }
    return _array;
}

@end

用两个栈模拟队列

思路如下:

准备2个栈:inStack,outStack
入队时,push到inStack中
出栈时,如果outStack为空,将inStack所有元素逐一弹出,push到outStack,outStack弹出栈顶元素;
如果outStack不为空,outStack弹出栈顶元素。

关于栈的说明可参考该链接:https://blog.csdn.net/lyz0925/article/details/106332137
代码实现如下:

#import "YZQueue.h"
#import "YZStack.h"

@interface YZQueue ()

@property (nonatomic, strong) YZStack *inputStack;
@property (nonatomic, strong) YZStack *outStack;

@end

@implementation YZQueue

//获取元素的数量
- (NSInteger)size {
    return self.inputStack.size + self.outStack.size;
}

//队列是否为空
- (BOOL)isEmpty {
    return self.inputStack.isEmpty && self.outStack.isEmpty;
}
//入队
- (void)enterQueue:(id)value {
    [self.inputStack push:value];
}
//出队
- (id)deQueue {
    if (self.outStack.isEmpty) {
        while (!self.inputStack.isEmpty) {
            [self.outStack push:self.inputStack.pop];
        }
    }
    return self.outStack.pop;
}
//获取对象的头元素
- (id)front {
    if (self.outStack.isEmpty) {
        while (!self.inputStack.isEmpty) {
            [self.outStack push:self.inputStack.pop];
        }
    }
    return self.outStack.top;
}

#pragma mark - 懒加载
- (YZStack *)inputStack {
    if (!_inputStack) {
        _inputStack = [[YZStack alloc] init];
    }
    return _inputStack;
}

- (YZStack *)outStack {
    if (!_outStack) {
        _outStack = [[YZStack alloc] init];
    }
    return _outStack;
}

@end

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
F-stack是一个高性能网络框架,其特点在于能够轻松实现高性能,低延迟的应用程序,而其中的多队列特性更是让它具有出色的表现。 多队列实现方式是利用不同的队列处理不同的网络连接,从而把网络连接分流到不同的队列中,使得每一个队列都能独立地处理网络连接,从而实现了高效、高吞吐量的网络传输。对于高并发的任务来说,多队列是一个必要的方案,因为它可以充分利用CPU的多核心来执行并行处理,从而加速网络连接的处理速度,降低延迟。 F-stack的多队列功能与其他网络框架比较有几个明显的优势:首先,它利用了DPDK(Data Plane Development Kit)来实现高速数据包的处理,进而将数据包分配到不同队列中去。其次,它支持多种处理方式,包括多线程、多进程、异步I/O等多种方式,这些都能够提供更好的性能,更灵活的解决方案以及更加可靠的网络连接操作。 另外,F-stack的多队列还能够有效地解决应用程序在高并发下遇到的问题。比如,当某个队列的处理能力达到瓶颈时,还可以通过动态分配网络连接的方式,将网络连接分配到其他队列当中去,从而充分利用CPU的多核心来提高应用程序的并发能力。 总的来说,F-stack队列功能为应对高并发、低延迟的网络传输需求提供了一个非常高效的解决方案,而其采用的多种处理方式以及动态分配功能,也使得它在运行过程中十分稳定、可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值