美文网首页
iOS栈的简单实现

iOS栈的简单实现

作者: 谁拿浮生伴我一世流年 | 来源:发表于2017-12-07 10:09 被阅读202次

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

    栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。

    实现代码:

    // StackForImplement.h

    /**

    定义block

    @param obj 回调值

    */

    typedef void(^StackBlock)(id obj);

    // 简单实现一个栈

    @interface StackForImplement : NSObject

    /**

    入栈

    @param obj 指定入栈对象

    */

    - (void)push:(id)obj;

    /**

    出栈

    */

    - (id)popObj;

    /**

    是否为空

    */

    - (BOOL)isEmpty;

    /**

    栈的长度

    */

    - (NSInteger)stackLength;

    /**

    从栈底开始遍历

    @param block 回调遍历的结果

    */

    -(void)enumerateObjectsFromBottom:(StackBlock)block;

    /**

    从顶部开始遍历

    */

    -(void)enumerateObjectsFromtop:(StackBlock)block;

    /**

    所有元素出栈,一边出栈一边返回元素

    */

    -(void)enumerateObjectsPopStack:(StackBlock)block;

    /**

    清空

    */

    -(void)removeAllObjects;

    /**

    返回栈顶元素

    */

    -(id)topObj;

    @end

    // StackForImplement.m

    @interface StackForImplement ()

    // 存储栈数据

    @property (nonatomic, strong) NSMutableArray *stackArray;

    @end

    @implementation StackForImplement

    - (void)push:(id)obj {

    [self.stackArray addObject:obj];

    }

    - (id)popObj {

    if ([self isEmpty]) {

    return nil;

    } else {

    return self.stackArray.lastObject;

    }

    }

    - (BOOL)isEmpty {

    return !self.stackArray.count;

    }

    - (NSInteger)stackLength {

    return self.stackArray.count;

    }

    -(void)enumerateObjectsFromBottom:(StackBlock)block {

    [self.stackArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

    block ? block(obj) : nil;

    }];

    }

    -(void)enumerateObjectsFromtop:(StackBlock)block {

    [self.stackArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

    block ? block(obj) : nil;

    }];

    }

    -(void)enumerateObjectsPopStack:(StackBlock)block {

    __weak typeof(self) weakSelf = self;

    NSUInteger count = self.stackArray.count;

    for (NSUInteger i = count; i > 0; i --) {

    if (block) {

    block(weakSelf.stackArray.lastObject);

    [self.stackArray removeLastObject];

    }

    }

    }

    -(void)removeAllObjects {

    [self.stackArray removeAllObjects];

    }

    -(id)topObj {

    if ([self isEmpty]) {

    return nil;

    } else {

    return self.stackArray.lastObject;

    }

    }

    - (NSMutableArray *)stackArray {

    if (!_stackArray) {

    _stackArray = [NSMutableArray array];

    }

    return _stackArray;

    }

    @end

    相关文章

      网友评论

          本文标题:iOS栈的简单实现

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