Objective-C实现一个简单的栈
2016-07-05 19:36
579 查看
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
实现代码:
简单实现,如上。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(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
简单实现,如上。
相关文章推荐
- 多线程设计模式——Immutable Object(不可变对象)
- [精通Objective-C]进阶技巧:使用ARC
- JAVA int 强制类型转换错误提示(Cannot cast from Object to int)
- Parcelable encountered IOException writing serializable object (name = xxx)
- iOS学习(五)Objective-C 类的实例化
- iOS学习(四)Objective-C 类的实现
- ArcObject开发,程序编译通过,但无法启动的解决
- sys.sysobjects (Transact-SQL)
- iOS学习(三)Objective-C 类的声明
- block 注意事项
- Qt学习之路(10): Meta-Object系统
- [精通Objective-C]预处理器
- objective-c 小结
- hibernate异常:a different object with the same identifier value was already associated
- 如何自己动手实现 KVO
- [SharePoint]javascript client object model 获取lookup 类型的field的值,包括user类型(单人或者多人)的值。how to get the multiple user type/lookup type field value by Javascript client object model
- jQuery serializeObject 序列化form表单Json对象 jQuery.extend()合并对象
- -[__NSCFArray removeObjectAtIndex:]: mutating meth
- BING: Binarized Normed Gradients for Objectness Estimation at 300fps
- object wait notify 实例一则