Objective-C實現一個簡單的棧


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

棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(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

簡單實現,如上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM