浙大数据结构与算法慕课随手记:第二讲 线性结构

2.1 线性表及其实现

例:一元多项式及其运算
方法1:顺序存储直接表示(数组,浪费空间)
方法2:顺序存储非零项(结构数组,(系数,指数)二元组,按指数大小有序存储)
方法3:链表存储非零项(定义两个数据域)

多项式表示问题启示:
1.同一个问题有不同表示/存储方法(数组or链表)
2.共性问题:有序线性序列的组织与管理

线性表:同类元素的有序线性序列(长度、空表、表头、表尾)
抽象数据类型描述
存储方法:

  • 顺序存储(数组,连续存放)
    主要操作实现:初始化、查找(按序号O(1)按值O(N))、插入O(N)、删除O(N)
  • 链式存储(链表,物理可以不相邻)
    主要操作实现:遍历求表长、遍历查找(按序号/按值)、插入、删除(free)

广义表:线性表的推广,元素可以是单元素/另一个广义表
例:二元多项式的表示
方法:看成关于x的一元多项式,“复杂”链表,链表嵌套?
*Tag-Data/Sublist-Next
*标志域-0单元素数据域/1指针域(复用存储空间)-指向后继结点

多重链表:结点有多个指针域(反之不一定成立,如双向链表)
——实现树、图等复杂结构
例:(稀疏)矩阵
x 二维数组
√ 十字链表:只存储非零项,通过两个指针域串联同行同列(循环链表)
*标识域Tag:Head头结点、Term非零结点

2.2 堆栈(Stack)

例:表达式求值
中缀表达式:运算数+运算符号(有优先级)
后缀表达式:顺序扫描,逐个处理
——需要有种顺序存储倒序输出的存储结构

堆栈:具有一定操作约束的有穷线性表,后入先出LIFO
只在栈顶Top插入(入栈Push)、删除(出栈Pop)
其他操作:创建空堆栈、判断是否空/满

  • 顺序存储实现:一维数组+栈顶指针Top(数组下标,-1代表空)
    *例:用一个数组实现两个堆栈(从两头向中间生长,用Tag区分)
  • 链式存储实现:单链表(链栈)+栈顶指针Top(指向Head头结点)

堆栈应用:表达式求值、函数调用及递归实现、DFS、回溯算法(老鼠走迷宫)
例:中缀表达式求值→后缀
运算数相对顺序不变(直接输出)
运算符号顺序改变(存储“等待中”,比较当前与栈顶“等待中”的优先级)
括号在堆栈外优先级高,入栈后低;左括号入栈,右括号pop栈顶运算符直至遇到左括号

2.3 队列(Queue)

队列:具有一定操作约束的有穷线性表,先入先出FIFO
在一段插入(入队AddQ,rear+1),在另一端删除(出队DeleteQ,front+1)
其他操作:创建空队列,判断是否空/满

  • 顺序存储实现:一维数组+队头指针front+队尾指针rear(均可初始化为-1)
    普通队列:front == rear表示队列空
    循环队列:front == rear表示队列空/满,区分可使用额外标记Size/Tag或不存满;使用求余函数实现循环
  • 链式存储实现:单链表+front指向Head+rear指向末尾

2.4 应用实例:多项式加法运算

思路:比较指数,相同指数的项系数相加,其余拷贝
方法:采用不带头结点的链表,按指数递减排列

小白专场:一元多项式的加法与乘法运算

求解思路
1.多项式表示:非零项,数组(简单+事先确定大小)/链表(复杂+动态性强)→动态数组
2.程序框架:4个函数
3.读多项式:rear=Null或指向临时头部空结点
4.加法实现
5.乘法实现
方法1:将乘法运算转换为加法运算(固定一项乘另一个多项式)
方法2:逐项插入(两重循环,关键:遍历找到插入位置)
6.多项式输出:链表遍历

你可能感兴趣的:(理论知识,数据结构,算法)