队列知识小了解
队列是一种特殊的线性表,只能头尾两端
进行操作。
- 队尾:只能从
队尾
添加元素,一般叫做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