数据结构--用Objective-C简单实现的数据结构:栈

前言:最近在学习数据结构,这里用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

测试代码:

数据结构--用Objective-C简单实现的数据结构:栈

该源码本人备份在百度云上了:链接: http://pan.baidu.com/s/1pKPrnsR 密码: eug9

上一篇:《Web前端工程师修炼之道(原书第4版)》——自我测验


下一篇:Appium 自动化测试演示