大话数据结构笔记(五)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xintonghanchuang/article/details/89477984
  1. 循环链表:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list).
    在这里插入图片描述
    如果循环链表为带有头结点的空表:
    在这里插入图片描述
  2. 双向链表(double linked list):是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.

a. 非空双向循环链表:
在这里插入图片描述
b. 空双向循环链表:
在这里插入图片描述

  1. 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表.
  2. 栈顶和栈底:我们把允许插入和删除的一段称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈.栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构.
  3. 栈的插入操作叫做进栈,也称压栈或入栈.栈的删除操作叫做出栈,也称弹栈.
    在这里插入图片描述
  4. 栈的抽象数据类型
    在这里插入图片描述
  5. 栈的顺序存储结构:栈是线性表的特例,因此我们将变化最小的下标为0的一端作为栈底.
  6. 栈的顺序存储结构:

a. 栈顺序存储结构的定义:
在这里插入图片描述
在这里插入图片描述
b. 进栈操作
在这里插入图片描述
c. 出栈操作
在这里插入图片描述
d. 两栈共享空间

i. 对于两个相同类型的栈,特别是两个栈的空间需求有相反关系时,即一个栈增长时,另一个栈在缩短的情况.为了提高空间存储的利用率,我们让两栈共享一组存储空间,如图,top1与top2分别是栈1和栈2的栈顶指针.
在这里插入图片描述
ii. 两栈共享空间结构代码:
在这里插入图片描述
iii. 两栈共享空间插入:stackNumber是判断栈1栈2.
在这里插入图片描述
iv. 两栈共享空间删除
在这里插入图片描述

  1. 栈的链式存储结构及实现

a. 栈的链式存储结构简称为栈链.栈链是不需要头结点的,因此空栈时,top=NULL.在计算机内存足够的情况下,栈链是不存在满栈的情况的.
在这里插入图片描述
b. 代码实现
在这里插入图片描述

10.栈的链式存储结构操作

a. 入栈操作
在这里插入图片描述
在这里插入图片描述

b. 出栈操作
在这里插入图片描述
在这里插入图片描述

  1. 顺序栈与链栈的异同

a. 相同点:

i. 顺序栈与链栈时间复杂度相同,均为O(1);

b. 不同点:

i. 空间性能

  1. 顺序栈需要实现确定固定的空间长度,可能会存在内存空间浪费的问题.
  2. 链栈不需要固定的空间大小,但链栈每个元素都有指针域,增加了内存开销.
  1. 如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一些.
  2. 栈的作用:栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,聚焦与问题核心.而数组要分散精力去考虑数组的下标增减等细节问题,掩盖了问题的本质.
  3. 栈的应用

a. 递归

i. 递归定义:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数.
ii. 每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出.
iii. 斐波那契数列(Fibonacci)

  1. 迭代实现:
    在这里插入图片描述
  1. 递归实现:
    在这里插入图片描述

iv. 迭代与递归的区别:

  1. 迭代使用的是循环结构,递归使用的是选择结构.
  2. 递归能使程序更清晰,更简洁,更容易让人理解,从而减少读懂代码的时间.
  3. 大量的递归调用会建立函数的副本,会耗费大量的时间和内存.迭代则不需要反复调用函数和占用而外的内存.

b. 四则运算

i. 逆波兰表示:一种不需要括号的,所有的符号都是在运算数字后面出现的后缀表达法.例如:”931-3*+102/+”

  1. 后缀表达式计算规则:从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈进行运算,运算结果进栈,一直到最终获得结果.

ii. 中缀表达式:标准的四则运算,例如”9+(3-1)*3+10/2”

  1. 中缀表达式运算规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即称为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进展,一直到最终输出后缀表达式为止.

iii. 计算机处理标准四则运算的过程:

  1. 将中缀表达式转化为后缀表达式(栈用来进出运算符号).
  2. 将后缀表达式进行运算得出结果(栈用来进出运算的数字).
  1. 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.

  2. 队列是一种先进先出(First In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头.
    在这里插入图片描述

  3. 队列的抽象数据类型
    在这里插入图片描述

  4. 队列其实也是一种特殊的线性表.

  5. 循环队列:我们把队列的这种头尾相接的顺序存储结构称为循环队列.

  6. 循环队列的数序存储结构代码:
    在这里插入图片描述
    循环队列初始化代码:
    在这里插入图片描述
    循环队列的入队列操作:
    在这里插入图片描述
    循环队列的除队列操作:
    在这里插入图片描述

  7. 队列的链式存储结构:其实就使线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列.

  8. 队头指针指向链队列的头结点,尾指针指向链队列的尾结点.空队列时队头指针和队尾指针都指向头结点.
    在这里插入图片描述
    在这里插入图片描述

  9. 链队列的结构:
    

在这里插入图片描述
23. 队列的链式存储结构操作:

a. 入队操作:链表尾部插入新的数据
在这里插入图片描述
b. 出队操作:出队操作就使头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素时,则需要将rear(队尾指针)指向头结点
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xintonghanchuang/article/details/89477984