第二章:线性表、栈和队列

什么是线性表?

线性表是由n个相同类型的数据元素组成的有限序列,它是最基本的一种线性结构。顾名思义,线性表就像是一条线,不会分叉。线性表有唯一的开始和结束,除了第一个元素外,每个元素都有唯一的直接前驱,除了最后一个元素外,每个元素都有唯一的直接后继。线性表有两种存储方式,分别是顺序存储和链式存储。采用顺序存储的线性表称为顺序表,采用链式存储的线性表称为链表。链表又分为单链表、双向链表和循环链表。

顺序表:顺序表采用顺序存储方式,元素存储是连续的,中间不允许有空,因此顺序表可以快速定位是第几个元素,但是插入和删除需要移动大量的元素。

顺序表的基本操作:

(1)取值:顺序表中的任何一个元素都可以立即找到,称为随机存取方式。例如,要取第i个元素,只要i值合理,可以找到该元素,由于下标是从0开始的,因此第i个元素,其下标为i-1。线性表取值的时间复杂度为O(1)。

(2)查找:在顺序表中查找一个元素e,可以从第一个元素开始顺序查找,依次比较每一个元素值,如果相等,则返回元素位置(位序,即第几个元素),如果查找整个顺序表都没找到,则返回-1。线性表取值的时间复杂度为O(n)。

(3)插入:在顺序表中第i个位置之前插入一个元素e,需要从最后一个元素开始,后移一位,…,直到把第i个元素也后移一位,然后把e放入第i个位置。线性表取值的时间复杂度为O(n)。

(4)删除:在顺序表中删除第i个元素,需要把该元素暂存到变量e,然后从i+1个元素开始前移,…,直到把第n个元素也前移一位,即可完成删除操作。线性表取值的时间复杂度为O(n)。

顺序表的优点:操作简单,存储密度高,可以随机存取,只需要O(1)的时间就可以取出第i个元素。

顺序表的缺点:需要预先分配最大空间,最大空间估计过大或过小会造成空间浪费或者溢出。插入和删除操作需要移动大量的元素。

在实际问题中,如果经常需要插入和删除操作,则顺序表的效率很低。为了克服该缺点,可以采取链式存储。我们首先来看看最简单的单链表。

单链表:可以给每个元素附加一个指针域(或者数组),指向下一个元素的存储位置。如下图所示,每个节点包含两个域,数据域和指针域。数据域存储数据元素,指针域存储下一个节点的地址。每个指针都指向下一个节点,都是朝着一个方向的,这样的链表称为单链表。

取值:单链表的取值不像顺序表那样可以随机访问任何一个元素,必须从第一个结点开始按顺序向后找,一直找到第i个结点。单链表取值的时间复杂度为O(n)。

查找:在一个单链表中查找是否存在元素e,可以定义一个p 指针,指向第一个元素结点,比较p指向结点的数据域是否等于e。单链表查找的时间复杂度为O(n)。

插入:如果要在第i个结点之前插入一个元素,则必须先找到第i-1个结点,想一想:为什么?单链表插入的时间复杂度为O(1)。

删除:删除一个结点,实际上是把这个结点跳过去。根据单向链表向后操作的特性,要想跳过第i个结点,就必须先找到第i-1个结点。单链表插入的时间复杂度为O(1)。

在单链表中,每个节点除了存储自身的数据之外还存在了下一个节点的地址,因此可以轻松的访问下一个节点,以及后面的所有的后继节点。但是,如果想访问前面的节点就不行了,再也回不去了。单链表只能向后操作,不可以向前操作,该怎么办呢?因此,还有另外一种链表——双向链表。

双向链表:为了向前、向后操作方便,可以给每个元素附加两个指针域,一个存储前一个元素的地址,另一个存储下一个元素的地址。

那么除了双向链表之外,循环链表也可以解决单链表只能向后操作,不可以向前操作。所谓的循环链表就是让单链表的最后一个节点的指针指向头节点,这样就形成了一个环,这样就可以从任何一个节点出发,访问所有的节点了。循环链表和普通链表的区别就是最后一个节点的后继指向了头节点。

链表的优点:链表是动态存储的,不需要预先分配最大空间,插入和删除不需要移动元素。

链表的缺点:每次动态分配一个节点,每个节点的地址是不连续的,需要有指针域记录下一个节点的地址,指针域需要占用一个int的空间,因此存储密度低。其次存取的时间复杂度较大。说完了什么是线性表之后,我们再来看看什么是栈。

什么是栈?

小李攒钱买了车,可是他家住在胡同的尽头。胡同很窄,只能通过一辆车,而且是死胡同。小李每天都为停车发愁,如果回家早了停在里面,早上上班就要让所有人挪车,先让最外面的车出

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值