数据结构与算法分析第三章

第三章 表、栈和队列

本章介绍了三种最基本、最简单的数据结构,如标题。
本章重点:

  • 介绍抽象数据类型(ADT)的概念
  • 阐述如何对表进行有效的操作
  • 介绍ADT及其在实现递归方面的应用
  • 介绍队列ADT及其在操作系统和算法设计中的应用

抽象数据类型(abstract data type,ADT)是实现存储数据的存储结构及其实现基本操作的算法

1.表ADT

连续线性存储数据的简单结构,实现方法:

  • 数组实现
  • 指针实现
  • 游标实现

对表所有的操作都可以用数组来实现,数组是动态指定的,而且需要对表的最大值进行估计,数组可以使标的某些操作受益,比如PrintList和Find操作,都可以在线性时间下完成,然而插入和删除的花费则是昂贵的,插入需要把插入位置之后的元素都向后移一个位置,删除则需要向前移一个位置,这两种操作最坏情况下复杂度为O(n),所以简单数组一般不用来实现这种结构

为了避免插入和删除的线性花费,我们允许表可以不连续的存储(在内存中),由此我们使用指针来实现(书上的很简单,我用智能指针+模板实现的)
https://blog.csdn.net/lancelot0902/article/details/91364882

如果某种语言不支持指针,我们可以采用第三种方法-游标法,我们设置一个结构体数组,结构体包含data和next,next指向下一数据在数组中的下标,例如a[1]=2说明a[1]的后继元素是a[2],因为我们使用的是数组,所以本质上没有new和free来添加或删除节点,所以我们维持一个FreeList链表,用CursorAlloc和CursorFree来控制该链表,若要添加元素则从FreeList中拿走一个,若删除元素,则把删除的节点加到FreeList中去
https://blog.csdn.net/lancelot0902/article/details/91413853

栈ADT

  • 链表实现
  • 数组实现

应用:函数调用,发生函数调用时,要存储所有重要的信息(活动记录、栈帧whatever),可以用一个栈来保存这些信息,然后控制转移到新函数执行新函数的操作,执行完毕后,再将这些信息转移过来,控制转移的原来的函数,因此在使用递归时,不能忘记基准情形,而且递归的过程不能太长,这两种情况都会造成栈的溢出,所以有时用循环来代替递归时很好的选择

队列

  • 链表实现
  • 数组实现

循环队列的实现有两点注意:

  • 检测队列是否为空很重要
  • 队列的大小是通过front和rear隐式计算出的

猜你喜欢

转载自blog.csdn.net/lancelot0902/article/details/91364684