https://www.agnosticdev.com/blog-entry/objective-c/objective-c-algorithms-and-data-structures
具体实现示例:https://github.com/quinntaylor/CHDataStructures
数组
栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
![](https://img.haomeiwen.com/i4188482/c5f128f2a0ff95be.png)
队列
队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队
![](https://img.haomeiwen.com/i4188482/ca81628a0c90ba98.png)
链表
链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
![](https://img.haomeiwen.com/i4188482/f34900b290fd0fff.png)
链表的优点:
链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;
缺点:
因为含有大量的指针域,占用空间较大;
查找元素需要遍历链表来查找,非常耗时。
适用场景:
数据量较小,需要频繁增加,删除操作的场景
树
一般用于社会组织结构、人类家族血缘关系这种数据。
二叉树
每个结点至多只有两棵子树
二叉树的存储
![](https://img.haomeiwen.com/i4188482/90d3d0319dee453d.png)
- 顺序存储
在存储空间中按123...8910的数据存储,假如6不存在,也要留空间,所以如果不是完全二叉树,会造成空间浪费 -
链式存储
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); //打印根结点
}
}
图
略
网友评论