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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值