100天iOS数据结构与算法实战 Day02 - 栈
Posted Cocoa开发者社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天iOS数据结构与算法实战 Day02 - 栈相关的知识,希望对你有一定的参考价值。
说明:由于受限,文中外链可以在最后,点击阅读原文查看
栈的特性
栈 的特性是先进后出。
动画描述
栈最常见的场景
栈在ios开发中常见的是导航栈,push pop 操作就是这种进栈出栈的操作。
和栈有关的算法题目
Valid Parentheses
Basic Calculator
Evaluate Reverse Polish Notation
Implement Queue using Stacks
Implement Stack using Queues
Simplify Path
实现方式
主要有两种方法来实现栈:使用数组,使用链表。我们代码是用数组来实现的。
栈的基本操作方式
DSStack *testStack = [[DSStack alloc] initWithSize:4];
[testStack push:@"1"];
[testStack push:@"2"];
[testStack push:@"5"];
[testStack popLastObject];
NSLog(@"%@",testStack);
主要代码
- (instancetype)initWithSize:(NSUInteger)size
{
self = [super init];
if (self) {
if (size > 0) {
_stackArray = [[NSMutableArray alloc] initWithCapacity:size];
_maxStackSize = size;
}
else {
NSAssert(size != 0, @"Stack size must be > 0");
}
}
return self;
}
初始化给定大小,这样是有好处的。因为如果数组容量满的时候为了增加容量,频繁的动态创建数组 copy数组会消耗一定的内存
- (void)push:(id)object
{
if ([self isFull] && self.maxStackSize) {
NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:_maxStackSize*2];
self.stackArray = [newArray mutableCopy];
_maxStackSize = _maxStackSize*2;
}
if (object != nil) {
[self.stackArray addObject:object];
}
else {
NSAssert(object != nil, @"You can't push nil object to stack");
}
}
如果当前数组填充满了 则创建一个两倍容量的数组copy一份给原来的数组
- (id)popLastObject
{
id object = [self peek];
[self.stackArray removeLastObject];
return object;
}
如果当前数组不为空,存在数组最后一个对象则直接返回 并移除掉。
优化:
提供了一个初始化传入size的值是为了预估空间比较合理。如果没有预估好,频繁扩容会造成不断申请内存然后copy。举个例子提前初始化容量和不指定容量的对比效果图看下图:
为了避免这个问题提供一个压缩空间的方法
- (void)compressedStack
{
int capacitySize = (int)(_maxStackSize * 0.9);
int stackSize = (int)(self.stackArray.count);
if( stackSize < capacitySize ) {
NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:stackSize];
self.stackArray = [newArray mutableCopy];
_maxStackSize = stackSize;
}
}
如果当前栈内元素个数小于容量的90% ,那么压缩栈把容量设置为当前栈的实际元素个数。
栈操作复杂度
压栈操作是将新元素压入数组的尾部,而不是头部。在数组的头部插入元素是一个很耗时的操作,它的时间复杂度为 O(n),因为需要将现有元素往后移位为新元素腾出空间。而在尾部插入元素的时间复杂度为 O(1);无论数组有多少元素,这个操作所消耗的时间都是一个常量。
栈的实现Demo
[https://github.com/renmoqiqi/100-Days-Of-iOS-DataStructure-Algorithm/tree/master/Day02]
链接:https://mp.weixin.qq.com/s/vcVoqV-KNNTb8vnoLcds2A
---END---
以上是关于100天iOS数据结构与算法实战 Day02 - 栈的主要内容,如果未能解决你的问题,请参考以下文章
进阶篇全流程学习《20天掌握Pytorch实战》纪实 | Day02 | 图片数据建模流程范例
Leetcode刷题100天—705. 设计哈希集合(集合)—day74
100天算法入门 - 每日三题 - Day11丢失的数字移动零单词规律