棧作為一種數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。它按照先進后出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據被第一個讀出來)。棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指針。
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(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
簡單實現,如上。