資料結構--用Objective-C簡單實現的資料結構:棧

來源:互聯網
上載者:User

標籤:

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.