Objective-C实现一个简单的栈
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
实现代码:
// StackForImplement.h
/**
定义block
@param obj 回调值
*/
typedef void(^StackBlock)(id obj); // 简单实现一个栈
@interface StackForImplement : NSObject /**
入栈
@param obj 指定入栈对象
*/
- (void)push:(id)obj; /**
出栈
*/
- (id)popObj; /**
是否为空
*/
- (BOOL)isEmpty; /**
栈的长度
*/
- (NSInteger)stackLength; /**
从栈底开始遍历
@param block 回调遍历的结果
*/
-(void)enumerateObjectsFromBottom:(StackBlock)block; /**
从顶部开始遍历
*/
-(void)enumerateObjectsFromtop:(StackBlock)block; /**
所有元素出栈,一边出栈一边返回元素
*/
-(void)enumerateObjectsPopStack:(StackBlock)block; /**
清空
*/
-(void)removeAllObjects; /**
返回栈顶元素
*/
-(id)topObj; @end
// StackForImplement.m
@interface StackForImplement ()
// 存储栈数据
@property (nonatomic, strong) NSMutableArray *stackArray;
@end @implementation StackForImplement - (void)push:(id)obj {
[self.stackArray addObject:obj];
} - (id)popObj {
if ([self isEmpty]) {
return nil;
} else {
return self.stackArray.lastObject;
}
} - (BOOL)isEmpty {
return !self.stackArray.count;
} - (NSInteger)stackLength {
return self.stackArray.count;
} -(void)enumerateObjectsFromBottom:(StackBlock)block {
[self.stackArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
block ? block(obj) : nil;
}];
} -(void)enumerateObjectsFromtop:(StackBlock)block {
[self.stackArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
block ? block(obj) : nil;
}];
} -(void)enumerateObjectsPopStack:(StackBlock)block {
__weak typeof(self) weakSelf = self;
NSUInteger count = self.stackArray.count;
for (NSUInteger i = count; i > ; i --) {
if (block) {
block(weakSelf.stackArray.lastObject);
[self.stackArray removeLastObject];
}
}
} -(void)removeAllObjects {
[self.stackArray removeAllObjects];
} -(id)topObj {
if ([self isEmpty]) {
return nil;
} else {
return self.stackArray.lastObject;
}
} - (NSMutableArray *)stackArray {
if (!_stackArray) {
_stackArray = [NSMutableArray array];
}
return _stackArray;
}
@end
简单实现,如上。
Objective-C实现一个简单的栈的更多相关文章
- c++ template 实现一个简单的"栈"
一: 实现一个简单的swap 原来我们写swap一定会这样写: 对于int类型的: swap(const int &x,const int &y) { int temp; temp = ...
- Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序
题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1. ...
- Quartz2D之绘制一个简单的机器猫
学习iOS有一段时间了,在博客园也默默的潜水了两个月,见识了很多大神,收获不少. 今天整理笔记,发现忘记的不少,我感觉需要及时的整理一下了,同时也把做的小东西贴上来和大家分享一下. 最近学习了Quar ...
- C语言 简单的栈
//简单的栈 #include<stdio.h> #include<stdlib.h> //栈的介绍:栈先进后出,一般用于将数据逆序输出 //栈一般只有四种方法--进栈,出栈, ...
- [GC]一个简单的Garbage Collector的实现
前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为了增加自己的理解,决定把大牛的想法和代码分析一遍,与 ...
- 一个简单LINUX程序的逆向
开始之前的准备: 反汇编:IDA 十六进制编辑器: Hexworkshop LINUX环境: KALI LINUX 调试: EDB (KALI自带的) 一个简单的动态追码, 大牛们就略过吧…… 用16 ...
- 一个简单的Garbage Collector的实现
一个简单的Garbage Collector的实现 前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为 ...
- 【WPF】学习笔记(一)——做一个简单的电子签名板
参加实习(WPF)已经有两个多周的时间了,踩了一些坑,也算积累了一些小东西,准备慢慢拿出来分享一下.(●'◡'●) 这次呢就讲讲一个简单的电子签名板的实现. 先上张图(PS:字写得比较丑,不要太在意哈 ...
- 实现一个简单的虚拟DOM
现在的流行框架,无论React还是Vue,都采用虚拟DOM. 好处就是,当我们数据变化时,无需像Backbone那样整体重新渲染,而是局部刷新变化部分,如下组件模版: <ul class=&qu ...
随机推荐
- 面试大厂回来后,有一些话想对 Java 后端开发说一说
在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...
- 剑指Offer的学习笔记(C#篇)-- 不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 一 . 理解题目 这个题目可以让我们回归到小学,想想加法的竖式是怎么写的,哈哈,如果当时你不是那个竖式写错了, ...
- java基础第七篇之接口
1.什么是接口: * 接口是方法的集合,而且接口中的方法全是抽象的 * 你可以把接口看成一个特殊的"抽象类",接口中的方法全是抽象的 * * * 2.java中怎么定义接口: * ...
- UML工具 PlantUML SequenceDiagram
- Maven配置及使用总结
一. 安装Maven 1. Maven官网 http://maven.apache.org/ 2. 本例子下载最新的版本,apache-maven-3.3.9 解压后目录描述: bin 含有maven ...
- [题解](gcd/欧拉函数)luogu_P2568_GCD
求gcd(x,y)=p等价于求gcd(x/p,y/p)=1,转化为了n/p内互质的个数 所以欧拉函数,因为有序所以乘2,再特判一下只有在1,1情况下才会重复计算,所以每次都减一 数组开小一时爽,提交w ...
- python序列化模块 json&&pickle&&shelve
#序列化模块 #what #什么叫序列化--将原本的字典.列表等内容转换成一个字符串的过程叫做序列化. #why #序列化的目的 ##1.以某种存储形式使自定义对象持久化 ##2.将对象从一个地方传递 ...
- 学习笔记之a,b=b,a+b与a=b,b=a+b的区别
兔子序列中用到的常用的计算方法:a,b=b,a+b 当我们真正去运行的时候,会发现它与a=b,b=a+b是有区别的 实例代码如下: def YY(one): a,b,n=0,1,0 while( ...
- docker 在Windows下使用遇到的坑
1.大部分系统不支持直接安装docker for windows,只能使用docker toolbox,相当于在Windows上安装了一个linux的虚拟机 2.启动docker toolbox的时候 ...
- PHP&Java 调用C#的WCF
步骤一:用C#声明WCF [ServiceContract] public interface IService1 { [OperationContract] void DoWork(); [Oper ...