三.简答题
1.循环队列的优点是什么?如何判别它的空和满?
答:(1)循环队列的优点是相对于直线队列来讲的,直线队列在元素出队后,头指针向后移动,导致删除元素后的空间无法在利用,即使元素个数小于空间大小,依然无法再进行插入,即所谓的“假上溢”.当变成循环队列之后,删除元素后的空间仍然可以利用,最大限度的利用空间.(2)判断循环队列空和满有三种方法:第一,采用计数器来判断,空时,计数器为0,满时,计数器为maxsize;第二,另设一个布尔变量以匹别队列的空和满;第三,少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空)
2.栈和队列数据结构有什么特点?什么情况下用到栈什么情况下用到队列?
<答案参考:(1条消息) 栈和队列的特点,什么情况下使用?_Daring Lad的博客-CSDN博客_什么时候用栈什么时候用队列>
答:(1)栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出"的规则进行操作。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。
(2)栈的应用:函数调用和返回,数字转字符,表达式求值,走迷宫等等。在CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。在编程语言中:主要用来进行函数的调用和返回。队列的应用:队列主要用在和时间有关的地方,特别是操作系统中,队列是实现多任务的重要机制。windows中的消息机制就是通过队列来实现的。进程调度也是使用队列来实现,所以队列也是一个重要的机制。只要满足数据的先进先出原理就可以使用队列。
3.请简述一种判定给定的链表是以NULL结尾还是形成一个环的方法。
<答案参考:判断给定的链表是以null结尾还是形成一个环 - jiangfullll - 博客园 (cnblogs.com)>
答:解法1:使用散列表
1.从表头开始,逐个遍历链表中的每个节点。
2.对于每个节点,检查改节点的地址是否存在于三列表中
3.如果存在,则表明当前访问的节点已经被访问过了,出现这种情况只能是因为给定的链表中存在环。
4.如果三列表中没有当前节点的地址,那么把该地址插入三列表中。
5.重复上述过程,直到到达标尾或者直到环。
解法2:环判断算法
该方法使用两个在链表中具有不同移动速度的指针。一旦它们进入环就会相遇,即表示存在环。这个判断方法的正确性在于快速移动指针和慢速移动指针将会指向同一位置的唯一可能情况,就是整个或者部分链表是一个环。
4.设编号为1,2,3,4的四辆车,顺序进入一个栈式结构的站台,试写出这4辆车开出车站所有可能的顺序(每辆车可能入栈,可能不入栈,时间也可能不等)
<答案参考:(1条消息) 顺序进栈乱序出栈的所有可能顺序之算法_lm19880204的博客-CSDN博客>
答:至少有14种。
①全进之后再出情况,只有1种: 4,3,2,1
②进3个之后再出的情况,有3种,3,4,2,1 3,2,4,1 3,2,1,4
③进2个之后再出的情况,有5种,2,4,3,1 2,3,4,1 2,1,3,4 2,1,4,3 2,3,1,4
④进1个之后再出的情况,有5种,1,4,3,2 1,3,2,4 1,3,4,2 1,2,3,4 1,2,4,3
5.如何使用两个队列高效的实现一个栈,并分析该栈基本操作的时间复杂度。
<答案参考:队列实现栈,两个队列实现一个栈方法详解(含实现代码) (biancheng.net)>
方案 1入栈和出栈,都在 queue1 中完成,而 queue2 作为中转空间。
具体操作如图 1 和图 2 所示。
图 1 入栈操作示例
图 2 出栈操作示例
该操作过程与用栈实现队列的方案 1 一样,都是把第 2 个结构当作一个中转站,然后将数据来回倒。接下来看一个更优一点的方案。
方案 2从方案 1 的操作方式中,我们可以看出其劣势,即在出栈时要把 queue2 中的元素移动到 queue1 中。在两个队列之间能否不用每次先出栈再把元素移动回去?当然可以。下面是入栈、出栈的具体操作描述。