標籤:
前言:最近在學習資料結構,這裡用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
資料結構--用Objective-C簡單實現的資料結構:棧