免费智能真题库 > 历年试卷 > 数据库系统工程师 > 2021年上半年 数据库系统工程师 上午试卷 综合知识
  第7题      
  知识点:   队列   线性表
  关键词:   先进先出   线性表        章/节:   计算机软件基础知识       

 
( )是一种先进先出的线性表,只允许在表的一端插入元素,而在表的另一端删除元素。
 
 
  A.  栈
 
  B.  队列
 
  C.  串
 
  D.  树
 
 
 

 
  第5题    2021年上半年  
   48%
一个栈的输入序列为12.3.4,5,不可能得到的输出序列是( )。
  第5题    2020年下半年  
   33%
在常见的数据结构中,(5)是只能通过访问它的端来实现数据存储和检索的一种线性数据结构,它的修改遵循先进后出的原则;(6)是..
  第3题    2013年上半年  
   65%
为了便于实现多级中断嵌套,使用(3)来保护断点和现场最有效。
   知识点讲解    
   · 队列    · 线性表
 
       队列
               队列的定义及基本运算
               队列是一种先进先出(FIFO)的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入元素的一端称为队尾(rear),允许删除元素的一端称为队头(front)。
               队列的基本运算如下:
               ①初始化队列initQueue(Q):创建一个空的队列Q。
               ②判队空isEmpty(Q):当队列为空时返回“真”值,否则返回“假”值。
               ③入队enQueue(Q,x):将元素x加入到队列Q的队尾,并更新队尾指针。
               ④出队deQueue(Q):将队头元素从队列Q中删除,并更新队头指针。
               ⑤读队头元素frontQueUe(Q):返回队头元素的值,但不更新队头指针。
               队列的存储结构
               (1)队列的顺序存储。队列的顺序存储结构又称为顺序队列,它也是利用一组地址连续的存储单元存放队列中的元素。由于队中元素的插入和删除限定在表的两端进行,因此设置队头指针和队尾指针,分别指示出当前的队首元素和队尾元素。
               设顺序队列Q的容量为6,其队头指针为front,队尾指针为rear,头、尾指针和队列中元素之间的关系如下图所示。
               
               队列的头、尾指针与队列中元素之间的关系
               在顺序队列中,为了简化运算,元素入队时,只修改队尾指针;元素出队时,只修改队头指针。由于顺序队列的存储空间是提前设定的,因此队尾指针会有一个上限值,当队尾指针达到其上限时,就不能只通过修改队尾指针来实现新元素的入队操作了。此时,可将顺序队列假想成一个环状结构,如下图所示,称之为循环队列。
               
               循环队列的头、尾指针示意图
               设循环队列Q的容量为MAXSIZE,初始时队列为空,且Q.rear和Q.front都等于0,如下图(a)所示。元素入队时修改队尾指针,即令Q.rear=(Q.rear+1)% MAXSIZE,如下图(b)所示。元素出队时修改队头指针,即令Q.front=(Q.front+1)% MAXSIZE,如下图(c)所示。
               
               循环队列的头、尾指针示意图
               根据出队列操作的定义,当出队操作导致队列变为空时,有Q.rear==Q.front,如上图(d)所示;若队列满,则Q.rear==Q.front,如上图(e)所示。在队列空和队列满的情况下,循环队列的队头、队尾指针指向的位置是相同的,此时仅仅根据Q.rear和Q.front之间的关系无法断定队列的状态。为了区分队空和队满的情况,可采用两种处理方式:其一是设置一个标志位,以区别头、尾指针的值相同时队列是空还是满;其二是牺牲一个元素空间,约定以“队列的尾指针所指位置的下一个位置是头指针”表示队列满,如上图(f)所示,而头、尾指针的值相同时表示队列为空。
               设队列中的元素类型为整型,则循环队列的类型定义为:
               
               【函数】创建一个空的循环队列。
               
               【函数】元素入循环队列。
               
               【函数】元素出循环队列。
               
               (2)队列的链式存储。队列的链式存储也称为链队列。为了便于操作,可给链队列添加一个头结点,并令头指针指向头结点,如下图所示。因此,队列为空的判定条件是头指针和尾指针的值相同,且均指向头结点。
               
               链队列示意图
               队列的应用
               队列常用于处理需要排队的场合,如操作系统中处理打印任务的打印队列、离散事件的计算机模拟等。
 
       线性表
        线性表是指一个序列,常采用两种存储方法:顺序存储和链式存储,主要的基本操作是插入、删除和查找。
               线性表的定义
               一个线性表是n个元素的有限序列(n≥0),通常表示为(a1a2,…,an),其特点是在非空的线性表中:
               (1)存在唯一的一个称作“第一个”的元素。
               (2)存在唯一的一个称作“最后一个”的元素。
               (3)除第一个元素外,序列中的每个元素均只有一个直接前驱。
               (4)除最后一个元素外,序列中的每个元素均只有一个直接后继。
               线性表的存储结构
                      线性表的顺序存储
                      线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻,如下图所示。在这种存储方式下,元素间的逻辑关系无需占用额外的空间来存储。
                      
                      线性表的顺序存储
                      一般地,以LOC(a1)表示线性表中第一个元素的存储位置,L表示每个元素所占空间的大小,则顺序存储结构中,第i个元素ai的存储位置为:
                      LOC(ai)=LOC(a1)+(i-1)×L
                      线性表采用顺序存储结构的优点是可以随机存取表中的元素,按序号查找元素的速度很快。缺点是插入和删除操作需要移动元素,插入元素前要移动元素以挪出空的存储单元,然后再插入元素;删除元素时同样需要移动元素,以填充被删除的元素空出来的存储位置。
                      在表长为n的线性表中插入新元素时,共有n+1个可插入位置,在位置1(元素a1所在位置)插入元素时需要移动n个元素,在位置n+1(元素an所在位置之后)插入元素时不需要移动元素,因此,等概率下插入一个元素时平均的移动元素次数Einsert为:
                      
                      其中,Pi表示在表中位置i插入元素的概率。
                      在表长为n的线性表中删除元素时,共有n个可删除的元素,删除元素a1时需要移动n-1个元素,删除元素an时不需要移动元素,因此,等概率下删除一个元素时平均的移动元素次数Edelete为:
                      
                      其中,qi表示删除元素ai的概率。
                      线性表的链式存储
                      线性表的链式存储是用结点来存储数据元素,元素的结点地址可以连续,也可以不连续,因此,存储数据元素的同时必须存储元素之间的逻辑关系。另外,结点空间只有在需要的时候才申请,无须事先分配。基本的结点结构如下所示:
                      
                      结点中的数据域用于存储数据元素的值,指针域则存储当前元素的直接前驱或直接后继元素的位置信息,指针域中所存储的信息称为指针(或链)。
                      n个结点通过指针连成一个链表,若结点中只有一个指针域,则称为线性链表(或单链表),如下图(a)所示。
                      
                      线性表元素的单链表存储
                      在链式存储结构中,只需要一个指针(称为头指针,如上图(b)中的Head)指向第一个结点,就可以按照链接关系顺序地访问表中的任意一个元素。为了简化对链表状态的判定和处理,特别引入一个不存储数据元素的结点,称为头结点,将其作为链表的第一个结点并令头指针指向该结点。
                      在链式存储结构下进行插入和删除,其实质都是对相关指针的修改。
                      设单链表结点类型的定义为:
                      
                      在单链表p所指结点(下图中元素a所在结点)后插入新元素结点(s所指结点,下图(a)中元素c所在结点)时,操作如下:
                      
                      
                      在单链表中插入和删除结点时的指针变化示意图
                      在单链表中删除p所指结点的后继结点时,操作如下:
                      
                      在上图(b)中,若需删除元素b,则令p结点的指针域指向其后继的后继结点(即上图(b)中元素c所在结点),从而将元素b所在的结点从链表中摘除。
                      下面给出单链表上的插入和删除运算的实现过程。
                      【函数】单链表的插入运算。
                      
                      【函数】单链表的删除运算。
                      
                      线性表采用链表作为存储结构时,只能顺序地访问元素,而不能对元素进行随机存取。但其优点是插入和删除操作不需要移动元素。
                      根据结点中指针信息的实现方式,还有双向链表、循环链表和静态链表等链表结构。
                      .双向链表:每个结点包含两个指针,分别指明当前元素的直接前驱和直接后继信息,可在两个方向上遍历链表中的元素。
                      .循环链表:表尾结点的指针指向表中的第一个结点,可从表中任意结点开始遍历整个链表。
                      .静态链表:借助数组来描述线性表的链式存储结构。
                      若双向链表中结点的front和next指针域分别指示当前结点的直接前驱和直接后继,则在双向链表中插入s所指结点时相关结点的指针域变化情况如下图(a)所示,其操作过程如下:
                      
                      
                      双向链表中插入和删除结点时的指针变化示意图
                      在双向链表中删除p所指结点时相关结点的指针域变化情况如上图(b)所示,其操作过程如下:
                      
   题号导航      2021年上半年 数据库系统工程师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第7题    在手机中做本题