目录
优先级队列
优先级队列也是个队列,因此也是提供以下接口
@interface LCPriorityQueue : NSObject
/// 创建一个优先级队列
+(instancetype)priorityQueue;
/// 创建一个优先级队列
/// @param comparator 自定义比较器
+(instancetype)priorityQueueWithComparator:(nullable LCCompareBlock)comparator;
/// 元素的数量
-(int)size;
/// 是否为空
-(BOOL)isEmpty;
/// 入队
-(void)enQueue:(nonnull id)element;
/// 出队
-(id)deQueue;
/// 获取队列的头元素
-(id)front;
/// 清空
-(void)clear;
@end
普通的队列是 FIFO 原则,也就是先进先出
优先级队列则是按照优先级高低进行出队,比如将优先级最高的元素作为队头优先出队
队尾(rear) 44 33 22 11 队头(front)
优先级队列场景举例
医院的夜间门诊
队列元素是病人
优先级是病情的严重情况、挂号时间
操作系统的多任务调度
队列元素是任务
优先级是任务类型
优先队列的底层实现
根据优先队列的特点,很容易想到:可以直接利用二叉堆作为优先队列的底层实现
可以通过 Comparator 或 Comparable 去自定义优先级高低
@interface LCPriorityQueue()
@property(nonatomic,strong)LCBinaryHeap * heap;
@property(nonatomic,copy)LCCompareBlock comparator;
@end
@implementation LCPriorityQueue
/// 创建一个优先级队列
+(instancetype)priorityQueue{
return [self priorityQueueWithComparator:nil];
}
/// 创建一个优先级队列
/// @param comparator 自定义比较器
+(instancetype)priorityQueueWithComparator:(nullable LCCompareBlock)comparator{
LCPriorityQueue * pQueue = [[LCPriorityQueue alloc] init];
pQueue.comparator = comparator;
return pQueue;
}
-(LCBinaryHeap *)heap{
if(_heap == nil){
_heap = [LCBinaryHeap binaryHeapWithComparator:self.comparator];
}
return _heap;
}
/// 元素的数量
-(int)size{
return self.heap.size;
}
/// 是否为空
-(BOOL)isEmpty{
return self.heap.isEmpty;
}
/// 入队
-(void)enQueue:(nonnull id)element{
[self.heap add:element];
}
/// 出队
-(id)deQueue{
return [self.heap remove];
}
/// 获取队列的头元素
-(id)front{
return self.heap.get;
}
/// 清空
-(void)clear{
[self.heap clear];
}
#pragma mark - 内部方法
/// 获取两个元素的比较结果
/// @param element1 元素1
/// @param element2 元素2
-(LCCompareType)_compareElement1:(nonnull id)element1 element2:(nonnull id)element2{
assert(element1);
assert(element2);
return self.comparator?self.comparator(element1,element2):(LCCompareType)([element1 compare:element2]);
}
行者常至,为者常成!