230 likes | 512 Views
数据结构入门 --陈静. 数据结构 简介. 数据结构是 计算机存储、组织数据的方式。 数据结构 是 指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。. 数据结构 简介. 常用结构 : 数组 (Array) 队列 (Queue) 链表 (Linked List) 图 (Graph) 堆 (Heap) 散列表 (Hash). 一.线性表. 1. 线性表 是最基本、最简单、也是最常用的一种数据结构。
E N D
数据结构简介 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
数据结构简介 常用结构: 数组 (Array) 队列 (Queue) 链表 (Linked List) 图 (Graph) 堆 (Heap) 散列表 (Hash)
一.线性表 1.线性表是最基本、最简单、也是最常用的一种数据结构。 2.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。 3.线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
一.线性表 1.线性表是一个线性结构: 它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。一般地,一个线性表可以表示成一个线性序列:k1,k2,…,kn,其中k1是开始结点,kn是终端结点。k1是k2的前驱结点,k3是k2的后驱结点...... 是一个数据元素的有序(次序)集
一.线性表 2、线性表有两种基本的存储结构:顺序存储结构和链式存储结构。 3、顺序表具有以下两个基本特点: (1) 线性表的所有元素所占的存储空间是连续的。 (2) 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
一.线性表 4、线性表的链式存储 线性表的链式存储结构就是用一组任意的存储单元(可以是不连续的)存储线性表的数据元素。对线性表中的每一个数据元素,都需用两部分来存储:一部分用于存放数据元素值,称为数据域;另一部分用于存放直接前驱或直接后继结点的地址(指针),称为指针域,称这种存储单元为结点。
一.线性表 在实际应用中,线性表都是以栈、队列、字符串等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。
二.栈 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。 1.它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
二.栈 2. 允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 你想到现实中哪些类似场景?放盘子......
进栈顺序:123 若 栈容量是1,则可能的出栈序列是? 答案是123 若容量是2? 答案是123,213,231,. 若出栈顺序是321,312可以吗? 二.栈
二.栈 3.栈既然是一种线性表,所以线性表的顺序存储和链接存储结构同样适用于栈 3.1顺序存储 我们一般用数组来实现。 struct Stack { ElemType stack[StackMaxSize]; int top; };
二.栈 在顺序存储的栈中,top的值为-1表示栈空,每次向栈中压入一个元素时,首先使top增1,用以指示新的栈顶位置,然后再把元素赋值到这个位置上,每次从栈中弹出一个元素时,首先取出栈顶元素,然后使top减1,指示前一个元素成为新的栈顶元素。由此可知,对顺序栈的插入和删除运算相当于是在顺序表(即顺序存储的线性表)的表尾进行的,其时间复杂度为O(1)。 如:栈数组:a[10],top=0, 1入栈,a[top++]=1; 2入栈,a[top++]=2; 出栈:top--;(2出栈)
二.栈 3.2栈的链接存储结构 栈的链接存储结构与线性表的链接存储结构相同,是通过由结点构成的单链表实现的,此时表头指针被称为栈顶指针,由栈顶指针指向的表头结点被称为栈顶结点,整个单链表被称为链栈,即链接存储的栈。当向一个链栈插入元素时,是把该元素插入到栈顶,即使该元素结点的指针域指向原来的栈顶结点,而栈顶指针则修改为指向该元素结点,使该结点成为新的栈顶结点。当从一个链栈中删除元素时,是把栈顶元素结点删除掉,即取出栈顶元素后,使栈顶指针指向原栈顶结点的后继结点。由此可知,对链栈的插入和删除操作是在单链表的表头进行的,其时间复杂度为O(1)。
二.栈 具体实现: 栈顶即头指针:head p1进栈,p1->next=head,head=p1; 出栈:head=head->next; 应用:括号匹配等
三.队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。
三.队列 进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
进队:12345 出队:12345 对于顺序队列: 队列空的条件:front=rear 队列满的条件: rear - front = MAXSIZE 对于循环队列: 队列空的条件:front = rear 队列满的条件: front = ( rear+ 1) % MAXSIZE 三.队列
三.队列 1.队列的数组实现 队列可以用数组Q[1…m]来存储,数组的上界m即是队列所容许的最大容量。 在队列的运算中需设两个指针:head:队头指针,指向实际队头元素的前一个位置;tail:队尾指针,指向实际队尾元素所在的位置。一般情况下,两个指针的初值设为0,这时队列为空,没有元素。
三.队列 数组定义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,如果还要执行入队操作,则要发生"上溢",但实际上队列中还有三个空位置,所以这种溢出称为"假溢出"。
三.队列 克服假溢出的方法有两种。一种是将队列中的所有元素均向低地址区移动,显然这种方法是很浪费时间的;另一种方法是将数组存储区看成是一个首尾相接的环形区域。当存放到n地址后,下一个地址就"翻转"为1。在结构上采用这种技巧来存储的队列称为循环队列。
三.队列 2.队列的链表实现 在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。 基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。 队列采用的FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。