数据结构 第三章学习小结

  • 数据结构第三章学习小结
    • 3.1-3.3
      • 3.1 栈和队列的定义和特点
        • 栈的定义和特点
          • 仅在表尾进行插入或删除操作的线性表。(后进先出)
        • 队列的定义和特点
          • 在表头进行插入操作,在表尾进行删除操作的线性表。(先进先出)
      • 3.2 案例引入
        • 数制的转换
        • 括号匹配的检验
        • 表达式求值
        • 舞伴问题
      • 3.3 栈的表示和操作的实现
        • 栈的类型定义
          栈的抽象数据类型定义
          ADT Stack{
          数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0}
          数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=1,2, …,n }
          约定an端为栈顶,a1端为栈底。
          基本操作:
          InitStack( &S )
          操作结果:构造一个空栈S。
          DestroyStack ( &S )
          初始条件:栈S已存在。
          操作结果:销毁栈S。
          ClearStack( &S )
          初始条件:栈S已存在。
          操作结果:将S清为空栈。
          StackEmpty( S )
          初始条件:栈S已存在。
          操作结果:若S为空栈,则返回TRUE,否则返回FALSE。
          StackLength( S )
          初始条件:栈S已存在。
          操作结果:返回S的数据元素个数,即栈的长度。
          GetTop( S, &e )
          初始条件:栈S已存在且非空。
          操作结果:用e返回S的栈顶元素。
          Push( &S, e )
          初始条件:栈S已存在。
          操作结果:插入元素e为新的栈顶元素。
          Pop( &S, &e )
          初始条件:栈S已存在且非空。
          操作结果:删除S的栈顶元素,并用e返回其值。
          StackTraverse( S, visit() )
          初始条件:栈S已存在且非空。
          操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。
          }ADT Stack
        • 顺序栈的表示与实现
          • 基本操作实现算法:初始化/入栈/出栈/取栈顶元素
        • 链栈的表示与实现
          • 基本操作实现算法:初始化/入栈/出栈/取栈顶元素
    • 3.4 栈与递归
      • 递归求解:能够分解成几个相对简单且解法相同或类似的子问题来求解
      • 采用递归算法解决的问题
        • 1.定义是递归的 (实例:阶乘函数 )
        • 2.数据结构是递归的 (实例:链表)
        • 3. 问题的解法是递归的 (实例:Hanoi塔问题、八皇后问题、迷宫问题)
      • “分治法”——分解-求解的策略
        • 三个条件
          • (1) 能将一个问题转变成一个新问题, 而新问题与原问题的解法相同或类同, 不同的仅是处理的对象, 并且这些处理对象更小且变化有规律
          • (2) 可以通过上述转化而使问题简化
          • (3) 必须有一个明确的递归出口,或称递归的边界
    • 3.5 队列的表示和操作的实现
      • 队列有两种存储表示:顺序表示和链式表示
        • 循环队列——队列的顺序表示和实现 
          • 队空的条件: Q.front = Q.rear
          • 队满的条件: (Q rear+ 1)%MAXSIZE = Q.front
          • 基本操作实现算法:初始化/求队列长度/入队/出队/取队头元素
        • 链队——队列的链式表示和实现
          • 队列的类型定义
            队列的抽象数据类型定义:
            ADT Queue (
            数据对象:D={ai|ai∈ElemSet ,i=1,2,…, n ,n�O}
            数据关系:R={ <ai-1,ai> |ai-1,ai∈D , i=2, …, n}
            约定其中a1端为队列头,an端为队列尾。
            基本操作:
            InitQueue (&Q)
            操作结果:构造一个空队列Q。
            Des t royQueue (&Q)
            初始条件:队列Q已存在。
            操作结果:队列Q被销毁, 不再存在。
            ClearQueue (&Q)
            初始条件:队列Q巳存在。
            操作结果:将Q清为空队列。
            QueueEmpty (Q)
            初始条件:队列Q已存在。
            操作结果:若Q为空队列,则返回true, 否则返回false。
            QueueLength(Q)
            初始条件:队列Q已存在。
            操作结果:返回Q的元素个数,即队列的长度。
            GetHead(Q}
            初始条件:Q为非空队列。
            操作结果:返回Q的队头元素。
            EnQueue (&Q, e}
            初始条件:队列Q已存在。
            操作结果:插入元素e为Q的新的队尾元素。
            DeQueue(&Q, &e)
            初始条件:Q为非空队列。
            操作结果:删除Q的队头元素,并用e 返回其值。
            QueueTr aver se(Q)
            初始条件:Q已存在且非空。
            操作结果:从队头到队尾,依次对Q的每个数据元素访问。
            ) ADT Queue
          • 基本操作实现算法:初始化/入队/出队/取队头元素
    • 3.6-3.7
      • 3.6 案例分析与实现
      • 3.7 小结
  • 心得体会
    • 栈和队列的特点之前都了解过一点,所以比较熟悉,比较好掌握。主要难点个人觉得在于递归,说难不难,说简单不简单,还是得好好理解题意才能运用好。在pta上的作业代码使用了STL以及自定义栈两种方法,发现STL不用自定义,方便容易很多,但是STL也要注意它的使用方式,但是要多查多看多记多用。第三次分组协作代码个人感觉想思路的时候比之前脑子更好使了,哈哈,感觉写代码不太费力了。只要思路对了,一步步实现很简单。但是对于优化代码,或者说代码实现方式选择还是比较困难,所以以后还是得多注意多学习一下。第四章要开始学习kmp算法,感觉会比较难一点,但是依旧脚踏实地一步一步学,我相信可以掌握很好。
    • 补充递归:
      • 自底向上的求解方法:由最小规模问题逐步向上求解,直至求出原问题的解。
      • 自顶向下的求解方法:从原问题出发,分解出规模减小了的子问题,直至终止条件,然后由终止条件的结果进行回推,求出原问题的值。
    • 专业术语:迭代——循环结构
    • 补充栈和队列的比较:
      • 栈(Stack)和队列(Queue)是两种操作受限的线性表。

        (线性表:线性表是一种线性结构,它是一个含有n≥0个结点的有限序列,
        同一个线性表中的数据元素数据类型相同并且满足“一对一”的逻辑关系。

        “一对一”的逻辑关系指的是对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,
        有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。)

        这种受限表现在:栈的插入和删除操作只允许在表的尾端进行(在栈中成为“栈顶”),满足“FIFO:First In Last Out”;
        队列只允许在表尾插入数据元素,在表头删除数据元素,满足“First In First Out”。

        栈与队列的相同点:

        1.都是线性结构。

        2.插入操作都是限定在表尾进行。

        3.都可以通过顺序结构和链式结构实现。、

        4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

        5.多链栈和多链队列的管理模式可以相同。

        栈与队列的不同点:

        1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

        2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;
        常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

        3.顺序栈能够实现多栈空间共享,而顺序队列不能。

    • 补充递归的注意点:

      1.递归编程简单,只需要关注本层逻辑。
      2.递归可用备忘录,利用数组将数据存储下来并可读取,否则可能出现重复子问题的情况

  • 本章节分享:

    深究递归和迭代的区别、联系、优缺点及实例对比
    https://www.cnblogs.com/zhizhan/p/4892886.html

猜你喜欢

转载自www.cnblogs.com/stdeng/p/12769330.html