数据结构应试要点——线性表、栈和队列、串

线性表、栈和队列、串的基础知识请参阅相关书籍,这里列出考试时需要注意或容易忽视的地方。如有补充,欢迎评论或私信!

线性表部分

1.线性表的顺序存储结构是一种随机存取的存储结构,而非顺序存取。

随机存取就是当存储器中的数据被读取或写入时,所需要的时间与该数据所在的物理地址无关。更通俗地说,根据起始地址加上元素的序号,可以很方便地访问任意一个元素。

顺序存取是按记录的逻辑顺序进行读、写操作的存取方法。它的主要特点是在存取第N个数据时,必须先访问前(N-1)个数据。典型实例是链表。

2. 有头结点的双链表与循环链表中最后一个结点均指向头结点而非存储有效数据的第一个结点。

3.判断双链表与循环链表是否为空的条件为头结点的指针是否等于头指针,而非头结点的指针是否为空。

4.顺序存储只能用物理上的邻接关系来表示逻辑结构。

5.仅带尾指针的单循环链表可以使操作“在末尾插入结点”更加方便,但对操作“在末尾删除结点”无方便作用,其时间复杂度依然达到O(n)级别。

6.逻辑结构存储结构:一个指的是数据之间的关系,而另一个指这种关系在计算机中的表现形式。

  • 逻辑结构大致有三种:“一对一”(线性表、栈与队列)、“一对多”(树)、“多对多”(图)。
  • 存储结构大致分为如下几种:顺序存储、链式存储、树形存储、散列存储等。

栈和队列部分

1.时刻牢记队列在队头删除元素,在队尾插入元素。切忌思维定势将新元素插入到队列尾部。

2.除非有特殊说明,否则以一维数组A[0:n]存储的循环队列队满时仅可存储n-1个值

3.判断一种链表是否适合做链式队列时,考虑其插入删除操作的时间复杂度是否为O(1)

4.栈和队列的本质区别是插入、删除操作的限定不一样。即两种数据结构插入和删除被限定在了不同的位置。

5.执行函数时,其局部变量一般采用栈结构进行存储。

6.消除递归不一定需要使用栈。使用栈可以模拟递归的过程,但对于单向递归和尾递归而言,可以使用迭代的方式来消除递归。

7.栈和队列中,只有队列允许在表的两端进行运算,而栈只允许在栈顶方向进行操作。

8.矩阵存储问题要留意所给数字是下标数还是序列数,是求序列数还是下标数,下标从1开始还是从0开始,等等。通常情况下,这种问题的求解方法是画图和取特殊值代入排除。

串部分

1.空格串由若干空格组成,其长度为空格字符的个数

2.串的长度不必将末尾的‘\0’计算其中,这与<string.h>中包含的strlen()有所不同。

3.线性表主要以单个元素作为操作对象,进行单个元素的查找、插入和删除,而串则主要以子串作为操作对象,进行子串的查找、插入和删除。

4.在以顺序存储结构方式存储的串的操作中,若串值序列的长度超过上界,则超过预定义长度的串值会被舍去,称为截断。

5.对于KMP算法,这里贴上两个可能对理解算法流程有用的链接。

第一步:简单了解    https://www.zhihu.com/question/21923021

第二步:深入理解    https://www.cnblogs.com/zzuuoo666/p/9028287.html

常见算法思路

线性表

几个常用的设计技巧:头插法、尾插法、逆置法、归并法、双指针法。

将带头结点的单链表就地逆置

就地:空间复杂度为O(1)。

考虑将头结点与其余结点断开,然后将这些结点采用头插法的方式实现逆置。时间复杂度为O(n)。

使带头结点的单链表递增有序

考虑将头结点与其余结点断开,然后使用插入法对结点进行排序。时间复杂度为O(n²)。

若采用空间换时间的方法,则可以先将链表中的数据元素复制到一个数组中,然后使用时间复杂度为O(nlogn)的排序算法,再将数组元素依次插入链表中,此时时间复杂度为O(nlogn)。

找到两个单链表的公共结点

由于单链表除尾节点外均有且只有一个后继,因此从这两个链表的第一个公共结点开始,之后所有的结点均为公共结点,不可能再出现分叉。

基于这个结论,可以进行下面的步骤:从第一个结点开始依次比较两链表的结点,若相同,则该结点为公共结点,但两链表的长度很可能不等。而若已知链表a比链表b多k个结点,那么只需要先遍历链表a前k个结点,再依次比较两链表的结点,即可判断是否存在公共结点。

删除递增有序的单链表中重复的元素

由于是有序表,所有相同值域的结点都是相邻的。用p扫描递增单链表,p与其后继结点的值域相等时,删除其后继,否则p指向下一结点。

提取两递增单链表的公共元素

此算法关键在于“递增”,因此可以从第一个元素开始两两比较,若元素不等,则指向较小元素的指针指向下一个结点,直到遍历结束。

判断使用单链表存储的两个序列中是否存在一序列是另一序列的子序列

参考字符串的模式匹配算法。比较简单的一种算法是在每一次匹配失败后从主链上一次开始匹配的结点的后继重新开始匹配。

判断一个链表是否有环

设置快慢两个指针,快指针每次走两步,慢指针每次走一步。当两指针进入环中,必定会因为速度的差异而产生追及;而若无环,快慢指针永远不可能相遇。

栈和队列

括号匹配算法

扫描给定括号序列的每一个字符,若遇到左括号则进栈,遇到右括号则检查是否与当前栈顶的左括号匹配,匹配则出栈并继续读取,不匹配直接返回错误。最后检查栈是否为空,若非空则说明左右括号个数不匹配,同样返回错误。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值