数据存储有几种
线性
连续存储 【数组】
优点:
存取速度很快。
缺点:
事先需要知道数组的长度。
插入删除元素的效率极低。
空间通常是有限制的。
需要大块连续的内存块。
离散存储 【链表】
优点:
空间没有限制。
插入删除元素速度很快。缺点:
存取速度很慢。
线性结构的应用 【栈】
定义:
一种可以实现“新进后出”的存储结构。
分类:
- 静态栈。【以数组为内核的栈, 就是静态栈, 静态栈里面各个元素的物理内存地址是连续的】
- 动态栈。【相应地, 以链表为内核的栈就是动态栈, 栈里面的元素是用尾部指针来联系的】
算法:
- 出栈。
- 压栈。
应用:
- 函数调用。
线性结构的应用【队列】
定义:
一种可以实现“先进先出”的存储结构。
分类:
- 链式队列。【链表实现】
- 静态队列。【数组实现】
静态队列通常都必须是循环队列。
循环队列的讲解:
1. 静态队列为什么必须是循环队列。
2. 循环队列需要几个参数来确定。【两个参数:front(头) rear(尾)】
3. 循环对列各个参数的含义。【两个参数不同场合有不同含义】
(1)队列初始化:
front和rear的值都是零。
(2)队列非空:
front代表队列的第一个元素。
rear代表队列的最后一个有效元素的下一个结点。
(3)队列为空:
front和rear的值相等,但不一定为零。
4. 循环队列入队伪算法讲解。
入栈伪算法:
入栈的时候,尾部需要加一位。直接 rear + 1 这样的写法是错误的,正确的写法应该是 rear = (rear + 1) % 数组的长度。
5. 循环队列出队为算法讲解。
出栈的伪算法:
出栈的时候,是从头部先出,所以front 会移到下一个位置。写法类似于入栈。直接 front + 1 是错误的,正确的写法应该是: front = (front + 1) % 数组的长度。
6. 如何判断循环队列是否为空。
如果 front 与 rear的值相等,则循环对列 为空。
7. 如何判断循环队列是否已满。
两种方式:
1.多增加一种表标识参数。
2. 少用一种元素,判断front 和 rear 是否相邻【通常使用这种方式】。伪算法表示:if((rear + 1) % 数组长度 == front)
{
已满。
}
大话数据结构里面在讲循环队列的时候的图示还是 顺序存储的图,个人感觉还是郝斌老师的图比较形象,直接以圆形的方式来演示。