前言:最近在学习数据结构,这里用Objective-C简单实现了一下栈。用Objective-C确实好容易,因为我使用了Cocoa框架提供了NSMutableArray作为存储元素的集合,操作集合元素很方便。
只不过,下面这种实现方法可能不是最优化的,因为NSMutableArray不是最轻量级的集合容器。我现在还不知道如何写出最优化的栈实现,同时还需要满足这一个需求:存储的元素是OC对象 。
使用NSMutableArray作为存储元素的集合的优点:类似C语言实现栈的链式存储结构,就不会和C语言数组那样会出现溢出(或者是数组下标越界)的情况。
Objective-C源码:
文件StackForNSObject.h:
#import <Foundation/Foundation.h>
// 只要参数是一个id类型的block
typedef void (^StackBlock)(id objc);
@interface StackForNSObject : NSObject
// 入栈
-(void)push:(id)objet;
// 出栈
-(id)popTopElement;
// 返回栈顶元素
-(id)TopElement;
// 是否为空
-(BOOL)isEmpty;
// 栈的长度
-(NSInteger)stackLength;
// 遍历,从栈底开始遍历
-(void)traversalElementFromBottom:(StackBlock)block;
// 从顶部开始遍历
-(void)traversalElementFromtop:(StackBlock)block;
// 所有元素出栈,一边出栈一边返回元素
-(void)traversalElementPopStack:(StackBlock)block;
// 清空
-(void)removeAllObjects;
// 返回栈顶元素
-(id)topElemet;
@end
文件:StackForNSObject.m
#import "StackForNSObject.h"
@interface StackForNSObject ()
/** maxSize */
//@property (nonatomic,assign)NSInteger maxSize;
// 有入栈就有出栈的时候,使用强引用,就要记得释放引用
/** NSMutableArray */
@property (nonatomic,strong)NSMutableArray *stackArray;
/** top of stack */
@property (nonatomic,assign)NSInteger top;
/** stack */
//@property (nonatomic,weak)StackBlock stackBlock;
@end
@implementation StackForNSObject
// 初始化
// 入栈
-(void)push:(id)objet{
[self.stackArray addObject:objet];
}
// 出栈
-(id)popTopElement{
id objc = [self.stackArray lastObject];
[self.stackArray removeLastObject];
return objc;
}
// 返回栈顶元素
-(id)TopElement{
return [self.stackArray lastObject];
}
// 是否为空
-(BOOL)isEmpty{
return self.stackArray.count;
}
// 栈的长度
-(NSInteger)stackLength{
return self.stackArray.count;
}
// 从底部开始遍历
-(void)traversalElementFromBottom:(StackBlock)block{
NSEnumerator *objc = [self.stackArray objectEnumerator];
for (id element in objc) {
block(element);
}
}
// 从顶部开始遍历
-(void)traversalElementFromtop:(StackBlock)block{
// 先获取存储元素的个数
NSInteger count = self.stackArray.count;
for (NSInteger i = count; i > 0; i --) {
// 处理最后一个元素
block([self.stackArray objectAtIndex:i]);
}
}
// 所有元素出栈,同时遍历
-(void)traversalElementPopStack:(StackBlock)block{
// 先获取存储元素的个数
NSInteger count = self.stackArray.count;
for (NSInteger i = count; i > 0; i --) {
// 处理最后一个元素
block(self.stackArray.lastObject);
[self.stackArray removeLastObject];
}
}
// 返回栈顶元素
-(id)topElemet{
return self.stackArray.lastObject;
}
// 清空
-(void)removeAllObjects{
[self.stackArray removeAllObjects];
}
#pragma mark - 懒加载
-(NSMutableArray*)stackArray{
if (_stackArray == nil) {
_stackArray = [NSMutableArray array];
}
return _stackArray;
}
-(NSInteger)top{
_top = self.stackArray.count;
return _top;
}
#pragma mark - 不存在该对象的时候,自动清空
- (void)dealloc{
[self.stackArray removeAllObjects];
}
@end
测试代码:
该源码本人备份在百度云上了:链接: http://pan.baidu.com/s/1pKPrnsR 密码: eug9