美文网首页算法数据结构
数据结构第一篇 栈

数据结构第一篇 栈

作者: 人魔七七 | 来源:发表于2018-05-08 21:46 被阅读73次

栈的特性

栈 的特性是先进后出。

栈的思考

压栈操作是将新元素压入数组的尾部,而不是头部。在数组的头部插入元素是一个很耗时的操作,它的时间复杂度为 O(n),因为需要将现有元素往后移位为新元素腾出空间。而在尾部插入元素的时间复杂度为 O(1);无论数组有多少元素,这个操作所消耗的时间都是一个常量。

栈在移动端 iOS开发中最常见的场景

栈在iOS开发中常见的是导航栈,push pop 操作就是这种进栈出栈的操作。

具体自己实现栈的操作方式

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% 那么压缩栈把容量设置为当前栈的实际元素个数

最后demo:https://github.com/renmoqiqi/DataStructureDemo

相关文章

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • 004 go语言实现栈

    1 数据结构 数据结构: 要实现的功能:0 栈的初始化1 获取栈长度2 入栈3 出栈4 清空栈内容5 判断栈是否为...

  • java高级知识点

    1.数据结构 程序=数据结构+算法 栈:后进先出,线性结构 入栈:push 出栈:pop假如已知入栈顺序是ab...

  • 栈和堆以及栈区和堆区的区别

    栈和堆以及栈区和堆区的区别 数据结构中的栈和堆 栈:具有先进后出性质的数据结构 堆:一种经过排序的树形数据结构,节...

  • 数据结构与算法 第二节:栈 栈: 一种先进后出的数据结构。可以想象成手枪的弹夹。 栈的特点: 栈的行为: 栈的代...

  • 2019-07-11—栈

    栈:Java数据结构和算法(四)——栈 string和char一般这么转化: 21、定义栈的数据结构,请在该类型中...

  • 什么是堆栈?

    堆与栈是两种数据结构,并不是一种数据结构,堆是堆,栈是栈。 1、栈:是一种只能在一端进行插入和删除的数据结构。 允...

  • 05--栈 递归

    栈 栈(Stack)又名堆栈,它是一种重要的数据结构。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线...

  • 18-04-21 python3 算法笔记 002基本数据结构

    线性数据结构 栈,队列,deques,列表其元素在数据结构中的位置由它被添加时的顺序决定。 栈 后进先出栈 LI...

  • 数据结构

    数据结构:要写!!手动!!数据结构非常简洁才可 栈 eg. 弹栈压栈的过程 链表 就是原型链不断的连接,要断去某个...

网友评论

    本文标题:数据结构第一篇 栈

    本文链接:https://www.haomeiwen.com/subject/xeqgrftx.html