前言:最近在学习数据结构,这里用Objective-C简单实现了一下栈。用Objective-C确实好容易,因为我使用了Cocoa框架提供了NSMutableArray作为存储元素的集合,操作集合元素很方便。
只不过,下面这种实现方法可能不是最优化的,因为NSMutableArray不是最轻量级的集合容器。我现在还不知道如何写出最优化的栈实现,同时还需要满足这一个需求:存储的元素是OC对象 。
使用NSMutableArray作为存储元素的集合的优点:类似C语言实现栈的链式存储结构,就不会和C语言数组那样会出现溢出(或者是数组下标越界)的情况。
Objective-C源码:
文件StackForNSObject.h:
1 #import <Foundation/Foundation.h> 2 3 // 只要参数是一个id类型的block 4 typedef void (^StackBlock)(id objc); 5 6 @interface StackForNSObject : NSObject 7 8 // 入栈 9 -(void)push:(id)objet; 10 // 出栈 11 -(id)popTopElement; 12 // 返回栈顶元素 13 -(id)TopElement; 14 // 是否为空 15 -(BOOL)isEmpty; 16 // 栈的长度 17 -(NSInteger)stackLength; 18 // 遍历,从栈底开始遍历 19 -(void)traversalElementFromBottom:(StackBlock)block; 20 // 从顶部开始遍历 21 -(void)traversalElementFromtop:(StackBlock)block; 22 // 所有元素出栈,一边出栈一边返回元素 23 -(void)traversalElementPopStack:(StackBlock)block; 24 // 清空 25 -(void)removeAllObjects; 26 // 返回栈顶元素 27 -(id)topElemet; 28 29 @end
文件:StackForNSObject.m
1 #import "StackForNSObject.h" 2 3 @interface StackForNSObject () 4 5 /** maxSize */ 6 //@property (nonatomic,assign)NSInteger maxSize; 7 8 // 有入栈就有出栈的时候,使用强引用,就要记得释放引用 9 /** NSMutableArray */ 10 @property (nonatomic,strong)NSMutableArray *stackArray; 11 12 /** top of stack */ 13 @property (nonatomic,assign)NSInteger top; 14 15 /** stack */ 16 //@property (nonatomic,weak)StackBlock stackBlock; 17 18 @end 19 20 @implementation StackForNSObject 21 22 // 初始化 23 24 // 入栈 25 -(void)push:(id)objet{ 26 [self.stackArray addObject:objet]; 27 } 28 29 // 出栈 30 -(id)popTopElement{ 31 id objc = [self.stackArray lastObject]; 32 [self.stackArray removeLastObject]; 33 return objc; 34 } 35 36 // 返回栈顶元素 37 -(id)TopElement{ 38 return [self.stackArray lastObject]; 39 } 40 41 // 是否为空 42 -(BOOL)isEmpty{ 43 return self.stackArray.count; 44 } 45 46 // 栈的长度 47 -(NSInteger)stackLength{ 48 return self.stackArray.count; 49 } 50 51 // 从底部开始遍历 52 -(void)traversalElementFromBottom:(StackBlock)block{ 53 NSEnumerator *objc = [self.stackArray objectEnumerator]; 54 for (id element in objc) { 55 block(element); 56 } 57 } 58 59 // 从顶部开始遍历 60 -(void)traversalElementFromtop:(StackBlock)block{ 61 // 先获取存储元素的个数 62 NSInteger count = self.stackArray.count; 63 for (NSInteger i = count; i > 0; i --) { 64 // 处理最后一个元素 65 block([self.stackArray objectAtIndex:i]); 66 } 67 } 68 69 // 所有元素出栈,同时遍历 70 -(void)traversalElementPopStack:(StackBlock)block{ 71 // 先获取存储元素的个数 72 NSInteger count = self.stackArray.count; 73 for (NSInteger i = count; i > 0; i --) { 74 // 处理最后一个元素 75 block(self.stackArray.lastObject); 76 [self.stackArray removeLastObject]; 77 } 78 } 79 80 // 返回栈顶元素 81 -(id)topElemet{ 82 return self.stackArray.lastObject; 83 } 84 85 // 清空 86 -(void)removeAllObjects{ 87 [self.stackArray removeAllObjects]; 88 } 89 90 #pragma mark - 懒加载 91 -(NSMutableArray*)stackArray{ 92 if (_stackArray == nil) { 93 _stackArray = [NSMutableArray array]; 94 } 95 return _stackArray; 96 } 97 -(NSInteger)top{ 98 _top = self.stackArray.count; 99 return _top; 100 } 101 102 #pragma mark - 不存在该对象的时候,自动清空 103 - (void)dealloc{ 104 [self.stackArray removeAllObjects]; 105 } 106 107 @end
测试代码:
该源码本人备份在百度云上了:链接: http://pan.baidu.com/s/1pKPrnsR 密码: eug9
时间: 2024-10-12 16:00:26