数据结构--用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 > ; i --) {
// 处理最后一个元素
block([self.stackArray objectAtIndex:i]);
}
} // 所有元素出栈,同时遍历
-(void)traversalElementPopStack:(StackBlock)block{
// 先获取存储元素的个数
NSInteger count = self.stackArray.count;
for (NSInteger i = count; i > ; 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
数据结构--用Objective-C简单实现的数据结构:栈的更多相关文章
- Python 简单说明与数据结构
Python 简单说明与数据结构 Python 作为 "国内" 较流行的高级语言,具有代码容易理解.专注解决问题.混合编译其他语言的优点. 变量 变量是一个最基本的储存单位,它暂时 ...
- 【数据结构】 Queue 的简单实现
[数据结构] Queue 的简单实现 public class XQueue<T> { /// <summary> /// 第一个元素 /// </summary> ...
- 数据结构和算法(Golang实现)(11)常见数据结构-前言
常见数据结构及算法 数据结构主要用来组织数据,也作为数据的容器,载体. 各种各样的算法,都需要使用一定的数据结构来组织数据. 常见的典型数据结构有: 链表 栈和队列 树 图 上述可以延伸出各种各样的术 ...
- 数据结构和算法(Golang实现)(12)常见数据结构-链表
链表 讲数据结构就离不开讲链表.因为数据结构是用来组织数据的,如何将一个数据关联到另外一个数据呢?链表可以将数据和数据之间关联起来,从一个数据指向另外一个数据. 一.链表 定义: 链表由一个个数据节点 ...
- 数据结构和算法(Golang实现)(13)常见数据结构-可变长数组
可变长数组 因为数组大小是固定的,当数据元素特别多时,固定的数组无法储存这么多的值,所以可变长数组出现了,这也是一种数据结构.在Golang语言中,可变长数组被内置在语言里面:切片slice. sli ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- 数据结构和算法(Golang实现)(15)常见数据结构-列表
列表 一.列表 List 我们又经常听到列表 List数据结构,其实这只是更宏观的统称,表示存放数据的队列. 列表List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数 ...
- 数据结构和算法(Golang实现)(16)常见数据结构-字典
字典 我们翻阅书籍时,很多时候都要查找目录,然后定位到我们要的页数,比如我们查找某个英文单词时,会从英语字典里查看单词表目录,然后定位到词的那一页. 计算机中,也有这种需求. 一.字典 字典是存储键值 ...
- 数据结构和算法(Golang实现)(17)常见数据结构-树
树 树是一种比较高级的基础数据结构,由n个有限节点组成的具有层次关系的集合. 树的定义: 有节点间的层次关系,分为父节点和子节点. 有唯一一个根节点,该根节点没有父节点. 除了根节点,每个节点有且只有 ...
随机推荐
- 常用的 SQL语句------CRUD
复习之前课本上的sql语句,以前上课的时候都是老师在上面讲,我们在下面玩,根本没有把这个放在心上,等到考试的时候临时学习突击下,就可以顺利过60了,但是现在不行了,自己要重新的学习sql,应该把里面最 ...
- The conversion of a varchar data type to a datetime data type resulted in an out-of-range value
刚刚有在程序中,传递一个空值至MS SQL Server数据库,这个值的数据类型为DATETIME执行时,它却发生了如标题提示的异常:The conversion of a varchar data ...
- dapper 注意事项之GUID
今天把ef框架换成了dapper,数据库使用的是mysql. 主键使用GUID,mysql数据库中设置的为varchar(36). 使用dapper报错,不能将string转换为GUID,后来调试比对 ...
- css背景图
- hibernate----component-entity (人-地址-学校)
package com.ij34.dao; import javax.persistence.*; @Entity @Table(name="school_inf") public ...
- maven安装与配置(第一天学习笔记)
Maven下载:http://maven.apache.org/ 1.首先要确保JDK已经安装与配置(注意:用的是apache-maven-3.3.3的JDK1.6不行,我用的是JDK1.8) 2.把 ...
- IT职业思考 谈谈IT外包公司
个人能力强才是王道 1. 为什么像BAT.HP.IBM.华为这些大公司还需要外包,他们已经有那么多的技术人员 一个公司,如果没有那么多项目,光养这些技术人员,实际的经营成本确实不低,但是这些技术人员又 ...
- PHP替代正则匹配的高效函数
strpos() - 查找字符串首次出现的位置 strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写). strripos() 函数查找字符串在另一字符串中最后一次出现的位置 ...
- MAC下配置WebDav
WebDav完全可以当成一个网络共享的文件服务器使用! # 1. 修改了两个配置文件 # 2. 创建web访问用户的用户名和口令 # 3. 创建了两个目录,并且设置了管理权限 # 切换目录 $ cd ...
- Java的主要数据类型(Primitive)
有一系列类需特别对待:可将它们想象成"基本"."主要"或者"主"(Primitive)类型,进行程序设计时要频繁用到它们.之所以要特别对待, ...