zoukankan      html  css  js  c++  java
  • 数据结构--用Objective-C简单实现的数据结构:栈

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

  • 相关阅读:
    个人号微信机器人接口
    js tree 根据子节点找到所有父节点
    大数据分析之纳税人画像-实现和优化思路
    前后端分离项目安全漏洞修复总结
    多租户&多账户&多公众号_saas微信公众平台设计思路
    java7 try-with-resources 很香
    java7 异常处理增强
    java7 try-with-resources 很香
    mysql 按分数段,每个专业分数段统计人数
    一文看懂奈奎斯特定理和香农定理
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/5327618.html
Copyright © 2011-2022 走看看