栈和队列
被考次数: 12次
被考频率: 高频率
答错率:    38%
知识难度:
考试要求: 掌握     
知识路径:  > 计算机系统基础知识  > 计算机软件基础知识  > 数据结构与算法  > 常用数据结构  > 线性结构


本知识点历年真题试卷分布
>> 试题列表    
 

 
       栈和队列是常用的两种数据结构,它们的逻辑结构与线性表相同。其特点在于运算受到了限制:栈按“后进先出”的规则进行修改,队列按“先进先出”的规则进行修改。
       栈
          栈的定义及基本运算
          栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。因此,栈又称为先进后出(FILO)或后进先出(LIFO)的线性表。在栈中进行插入和删除操作的一端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含数据元素的栈称为空栈。栈的基本运算如下:
          ①初始化栈initStack(S):创建一个空栈S。
          ②判栈空isEmpty(S):当栈S为空栈时返回“真”值,否则返回“假”值。
          ③入棧push(S,x):将元素x加入栈顶,并更新栈顶指针。
          ④出栈pop(S):将栈顶元素从栈中删除,并更新栈顶指针。若需要得到栈顶元素的值,可将pop(S)定义为一个函数,它返回栈顶元素的值。
          ⑤读栈顶元素top(S):返回栈顶元素的值,但不修改栈顶指针。
          栈的存储结构
          (1)栈的顺序存储。栈的顺序存储是指用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素,同时附设指针top指示栈顶元素的位置。采用顺序存储结构的栈也称为顺序栈。在顺序存储方式下,需要预先定义或申请栈的存储空间,也就是说栈空间的容量是有限的。因此在顺序栈中,当一个元素入栈时,需要判断是否栈满(栈空间中没有空闲单元),若栈满,则元素入栈会发生上溢现象。
          (2)栈的链式存储。为了克服顺序存储的栈可能存在上溢的不足,可以用链表存储栈中的元素。用链表作为存储结构的栈也称为链栈。由于栈中元素的插入和删除仅在栈顶一端进行,因此不必设置头结点,链表的头指针就是栈顶指针。
          栈的应用
          栈的典型应用包括表达式求值、括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。
       队列
          队列的定义及基本运算
          队列是一种先进先出(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)队列的链式存储。队列的链式存储也称为链队列。为了便于操作,可给链队列添加一个头结点,并令头指针指向头结点,如下图所示。因此,队列为空的判定条件是头指针和尾指针的值相同,且均指向头结点。
          
          链队列示意图
          队列的应用
          队列常用于处理需要排队的场合,如操作系统中处理打印任务的打印队列、离散事件的计算机模拟等。
 

更多复习资料
请登录电脑版软考在线 www.rkpass.cn

京B2-20210865 | 京ICP备2020040059号-5
京公网安备 11010502032051号 | 营业执照
 Copyright ©2000-2025 All Rights Reserved
软考在线版权所有