1 / 23

数据结构入门 --陈静

数据结构入门 --陈静. 数据结构 简介. 数据结构是 计算机存储、组织数据的方式。 数据结构 是 指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。. 数据结构 简介. 常用结构 : 数组 (Array) 队列 (Queue) 链表 (Linked List) 图 (Graph) 堆 (Heap) 散列表 (Hash). 一.线性表. 1. 线性表 是最基本、最简单、也是最常用的一种数据结构。

clea
Download Presentation

数据结构入门 --陈静

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数据结构入门 --陈静

  2. 数据结构简介 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

  3. 数据结构简介 常用结构: 数组 (Array) 队列 (Queue) 链表 (Linked List) 图 (Graph) 堆 (Heap) 散列表 (Hash)

  4. 一.线性表 1.线性表是最基本、最简单、也是最常用的一种数据结构。 2.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。 3.线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

  5. 一.线性表 1.线性表是一个线性结构: 它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。一般地,一个线性表可以表示成一个线性序列:k1,k2,…,kn,其中k1是开始结点,kn是终端结点。k1是k2的前驱结点,k3是k2的后驱结点...... 是一个数据元素的有序(次序)集

  6. 一.线性表 2、线性表有两种基本的存储结构:顺序存储结构和链式存储结构。 3、顺序表具有以下两个基本特点: (1) 线性表的所有元素所占的存储空间是连续的。 (2) 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。

  7. 一.线性表 4、线性表的链式存储 线性表的链式存储结构就是用一组任意的存储单元(可以是不连续的)存储线性表的数据元素。对线性表中的每一个数据元素,都需用两部分来存储:一部分用于存放数据元素值,称为数据域;另一部分用于存放直接前驱或直接后继结点的地址(指针),称为指针域,称这种存储单元为结点。

  8. 一.线性表 在实际应用中,线性表都是以栈、队列、字符串等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。

  9. 二.栈 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。 1.它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

  10. 二.栈 2. 允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 你想到现实中哪些类似场景?放盘子......

  11. 进栈顺序:123 若 栈容量是1,则可能的出栈序列是? 答案是123 若容量是2? 答案是123,213,231,. 若出栈顺序是321,312可以吗? 二.栈

  12. 二.栈 3.栈既然是一种线性表,所以线性表的顺序存储和链接存储结构同样适用于栈 3.1顺序存储 我们一般用数组来实现。 struct Stack { ElemType stack[StackMaxSize]; int top; };

  13. 二.栈 在顺序存储的栈中,top的值为-1表示栈空,每次向栈中压入一个元素时,首先使top增1,用以指示新的栈顶位置,然后再把元素赋值到这个位置上,每次从栈中弹出一个元素时,首先取出栈顶元素,然后使top减1,指示前一个元素成为新的栈顶元素。由此可知,对顺序栈的插入和删除运算相当于是在顺序表(即顺序存储的线性表)的表尾进行的,其时间复杂度为O(1)。 如:栈数组:a[10],top=0, 1入栈,a[top++]=1; 2入栈,a[top++]=2; 出栈:top--;(2出栈)

  14. 二.栈 3.2栈的链接存储结构 栈的链接存储结构与线性表的链接存储结构相同,是通过由结点构成的单链表实现的,此时表头指针被称为栈顶指针,由栈顶指针指向的表头结点被称为栈顶结点,整个单链表被称为链栈,即链接存储的栈。当向一个链栈插入元素时,是把该元素插入到栈顶,即使该元素结点的指针域指向原来的栈顶结点,而栈顶指针则修改为指向该元素结点,使该结点成为新的栈顶结点。当从一个链栈中删除元素时,是把栈顶元素结点删除掉,即取出栈顶元素后,使栈顶指针指向原栈顶结点的后继结点。由此可知,对链栈的插入和删除操作是在单链表的表头进行的,其时间复杂度为O(1)。

  15. 二.栈 具体实现: 栈顶即头指针:head p1进栈,p1->next=head,head=p1; 出栈:head=head->next; 应用:括号匹配等

  16. 三.队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

  17. 三.队列 进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。

  18. 进队:12345 出队:12345 对于顺序队列: 队列空的条件:front=rear 队列满的条件: rear - front = MAXSIZE 对于循环队列: 队列空的条件:front = rear 队列满的条件: front = ( rear+ 1) % MAXSIZE 三.队列

  19. 三.队列 1.队列的数组实现 队列可以用数组Q[1…m]来存储,数组的上界m即是队列所容许的最大容量。 在队列的运算中需设两个指针:head:队头指针,指向实际队头元素的前一个位置;tail:队尾指针,指向实际队尾元素所在的位置。一般情况下,两个指针的初值设为0,这时队列为空,没有元素。

  20. 三.队列 数组定义Q[1…10] Q(i) i=3,4,5,6,7,8头指针head=2,尾指针tail=8。队列中拥有的元素个数为:L=tail-head。现要让排头的元素出队,则需将头指针加1。即head=head+1这时头指针向上移动一个位置,指向Q(3),表示Q(3)已出队。如果想让一个新元素入队,则需尾指针向上移动一个位置。即tail=tail+1这时Q(9)入队。当队尾已经处理在最上面时,即tail=10,如果还要执行入队操作,则要发生"上溢",但实际上队列中还有三个空位置,所以这种溢出称为"假溢出"。

  21. 三.队列 克服假溢出的方法有两种。一种是将队列中的所有元素均向低地址区移动,显然这种方法是很浪费时间的;另一种方法是将数组存储区看成是一个首尾相接的环形区域。当存放到n地址后,下一个地址就"翻转"为1。在结构上采用这种技巧来存储的队列称为循环队列。

  22. 三.队列 2.队列的链表实现 在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。 基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。 队列采用的FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。

  23. THANK YOU

More Related