在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(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 简单实现,如上。
|
请发表评论