算法:
狭义的算法是与数据的存储方式密切相关
广义的算法与数据的存储方式无关
泛型: 利用某种技术达到的效果就是: 不同的存储方式,执行的操作是一样的
数据结构
狭义:
数据结构是专门研究数据存储的问题
数据的存储包含两个方面: 个体的存储 + 个体关系的存储
广义:
数据结构既包含数据的存储也包含数据的操作
对存储数据的操作就是算法
数据的存储结构有几种:
线性结构:连续存储【数组】
优点:存取速度很快
缺点:事先必须知道数组的长度,插入删除元素很慢,空间通常是有限制的,需要大块连续的内存块
离散存储【链表】
优点:空间没有限制, 插入删除元素很快
缺点:存取速度很慢
再次讨论什么是数据结构(此处习学了数据结构后所写)
数据结构是研究数据的存储和数据的操作的一门学问
数据结构的存储分为两部分:
个体的存储
个体关系的存储
从某种角度而言,数据的存储最核心的就是个体关系的存储,个体的存储可以忽略不计
再次讨论到底什么是泛型
同一种逻辑结构,无论该逻辑结构物理存储是什么样子的,我们可以对它执行相同的操作
线性结构的应用:栈和队列
栈
定义: 一种可以实现“先进后出”的存储结构
分类:静态栈
动态栈
算法:出栈
压栈
应用:函数调用;中断;表达式;内存分配;缓冲处理;迷宫
队列
定义: 一种可以实现“先进先出”的存储结构
分类:链式队列: 用链表实现
静态队列: 用数组实现
静态队列通常必须是循环队列
循环队列的讲解:
1. 静态队列为什么必须是循环队列
2. 循环队列需要几个参数来确定
需要两个参数来确定:front和rear
3. 循环队列各个参数的含义
建议初学者先记住,然后慢慢体会
1). 队列初始化:front和rear的值都为零
2). 队列非空:front代表的是队列的第一个元素;rear代表队列的最后一个有效元素
3). 队列空: front和rear的值相等,但不一定是零
4. 循环队列入队伪算法讲解
两步完成:
1. 将值存入r所代表的位置
2. 错误的写法: r = r+1;
正确的写法: r = (r+1)%数组的长度
5. 循环队列出队伪算法讲解
f = (f+1)%数组的长度
6. 如何判断循环队列是否为空
如果front=rear,则队列一定为空
7. 如何判断循环队列是否已满
预备知识: front的值可能比rear大,也可能比rear小,当然也可以两者相等
两种方式:
1. 多增加一个标识参数
2. 少用一个元素(通常用第二种方式)
如果r和f的值紧挨着,则队列已满。
用c语言伪算法表示为:
if((r+1)%数组长度==f)
已满
else
不满
队列算法:入队,出队
队列的具体应用: 所以和时间有关的操作都有队列的影子
非线性结构: 树,图