oc实现栈
栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。

/*栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
*/#import NS_ASSUME_NONNULL_BEGIN// 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
#import "StackForImplement.h"// 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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
