OC数据结构总结

本篇为转载,颜色标注部分为本人理解内容。

https://www.agnosticdev.com/blog-entry/objective-c/objective-c-algorithms-and-data-structures
具体实现示例:https://github.com/quinntaylor/CHDataStructures

数组

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。

举例理解:后进先出(窄盒子放东西)。如往一个窄盒子里面放球,一次只能放进一个球,最先能取出来的球一定是最上面那个,也就是最后放进去那个。

 

OC数据结构总结_第1张图片

image.png

队列

队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队

举例理解:先进先出(口语考试)。口语考试,一个考官考一个学生,先进去考试的学生先出来。

 

OC数据结构总结_第2张图片

image.png

链表

链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。

 

OC数据结构总结_第3张图片

image.png

 

链表的优点:
链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;

缺点:
因为含有大量的指针域,占用空间较大;
查找元素需要遍历链表来查找,非常耗时。

适用场景:
数据量较小,需要频繁增加,删除操作的场景

一般用于社会组织结构、人类家族血缘关系这种数据。

二叉树

每个结点至多只有两棵子树

二叉树的存储

OC数据结构总结_第4张图片

181910594566385.png

  • 顺序存储
    在存储空间中按123...8910的数据存储,假如6不存在,也要留空间,所以如果不是完全二叉树,会造成空间浪费
  • 链式存储

     

    OC数据结构总结_第5张图片

    991470-20161113210259170-2045193465.png

二叉树的遍历

分先序遍历、中序遍历、后序遍历三种,其实就是根据什么时候取根结点定的。先取根结点就是先序;后取根结点就是后序;遍历左子树后取根结点,然后遍历右子树就是中序。

  • 先序遍历
void PreOrderTraverse(BiTree T) {
    if (T != NULL) {
        printf("%d",T->data);  //打印根结点
        PreOrderTraverse(T->lchild);  //遍历左子树
        PreOrderTraverse(T->rchild);  //遍历右子树
    }
}
  • 中序遍历
void InOrderTraverse(BiTree T) {
    if (T != NULL) {
        InOrderTraverse(T->lchild);  //遍历左子树
        printf("%d",T->data);  //打印根结点
        InOrderTraverse(T->rchild);  //遍历右子树
    }
}
  • 后序遍历
  • 应用场景:删除二叉树的时候,先删除左子树和右子数,再删除节点。
void PostOrderTraverse(BiTree T) {
    if (T != NULL) {
        PostOrderTraverse(T->lchild);  //遍历左子树
        PostOrderTraverse(T->rchild);  //遍历右子树
        printf("%d",T->data);  //打印根结点
    }
}

 

 



作者:liboxiang
链接:https://www.jianshu.com/p/abaebd238559
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(OC数据结构总结)