C语言数据结构——第三章 栈和队列

三、栈和队列

  栈和队列是两种重要的线性结构。从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性的数据结构。

  从数据类型的角度看,它们是和线性表大不相同的两种重要的抽象数据类型,在面向对象的程序设计中,它们是多型数据类型。

   3.1-栈

    3.1.1-抽象数据类型栈的定义

      栈:是限定仅在表尾进行插入或删除操作的线性表,又可以称为后进先出的线性表。

      栈顶:栈的表尾端

      栈底:栈的表头端

      空栈:不含元素的空表

    3.1.2-栈的表示和实现

      和线性表相似,栈也有两种存储表示方法,即顺序栈和链栈。

      (1)栈的顺序存储

        所谓栈的顺序存储,就是采用一组物理上连续的存储单元来存放栈中所有元素,并使用top指针来指示当前栈中处于栈顶的元素。

      (1.1) 顺序栈的基本操作:

        -1:初始化栈函数的实现

        • 对栈空间进行初始化
        • 对栈顶指针进行初始化

        -2:判断栈是否为空的函数实现

        • 将当前栈顶指针的值与之前初始化的设置的栈顶指针的值相比较
        • 若两者相等,则表示当前栈为空,否则表示当前栈不为空

        -3:进栈函数的实现

        • 判断当前栈是否有剩余空间
        • 若当前栈未满,修改栈顶指针的值,使其指向栈的下一个空闲位置
        • 将要进栈的元素放在上述空闲位置,进栈操作完成
        • 若栈满则表示没有空间,无法进行栈操作

        -4:出栈函数的实现

        • 判断栈是否为空,若为空则无法进行出栈操作,给出栈为空的提示
        • 若栈不为空,则记下当前栈顶指针的值
        • 修改栈顶指针的值,使其指向出栈元素的下一个元素
        • 返回第二步中记下的栈顶指针的值对应栈中的元素

        -5:获取栈顶元素函数的实现

        • 判断当前栈是否为空
        • 若当前栈为空,则无法获取任何栈顶元素,词是给出栈为空的提示,并结束操作
        • 若不为空,则返回栈顶元素

        -6:遍历栈内元素函数的实现

        • 判断栈是否为空,若为空,则栈内没有元素可以访问,此时给出栈为空的提示
        • 若栈不为空,则从栈底到栈顶依次访问栈中元素

        -7:通过用户输入数据的方式创建一个顺序栈

        • 接收用户输入
        • 若用户输入的是空,则算法结束,否则执行下一步
        • 将用户输入的元素进栈

      (2)栈的链式存储

      栈的顺序存储通常要求系统分配一组连续的存储单元,在实现时,对于某些语言而言,当栈满后想要增加连续的存储空间时无法实现的。我们可以通过链式存储来实现需要多少存储空间就申请多少存储空间,这减低空间使用的浪费率。

      (2.1)链栈的基本操作

        -1:初始换链栈函数的实现

        • 创建一个链栈结点
        • 使用该结点对栈顶指针进行初始化

        -2:判断链栈是否为空函数的实现

        • 判断指示栈顶的结点的指针域是否为空
        • 若上一步为真,则表示当前栈为空,否则表示当前栈不为空

        -3:进栈函数的实现

        • 创建一个新的结点,并将待进栈的元素存入该结点的数据域中
        • 将新的结点的指针域指向栈顶结点指针与指向的结点
        • 将栈顶结点的指针域指向新的结点

        -4:出栈函数的实现

        • 判断栈是否为空
        • 若第一步为真,则无法执行元素出栈操作,此时给出栈为空的提示,否则执行
        • 记下此时的栈顶结点指针域指向的结点
        • 修改栈顶结点的指针域,在其中存入第三步记下的结点指针域的值
        • 将data域值为da的结点出栈

        -5:获取栈顶元素函数的实现

        • 判断栈是否为空
        • 若第一步为真,则执行第三步,否则执行第四步
        • 给出栈为空的提示并返回
        • 返回栈顶元素的值

        -6:通过用户输入的方式创一个链栈

        • 接收用户输入
        • 若第一步未结束标志,则算法结束,否则执行下一步
        • 将用户输入的元素进栈

  3.2-队列

    与栈一样,队列也是一种特殊的线性表,不同的是,队列在进行数据操作是必须遵循“先进先出”的原则,这一特点决定了队列的进本操作需要在其两端进行。

    3.2.1-队列的基本概念

      队列的基本操作通常在队列两端被执行,其中执行插入元素操作的一端被称为队尾;执行删除元素操作的一段被称为队头。队列中的元素个数就是队列的长度,若队列中不包含任何元素,则被称为队空,若队列中没有可用空间存储待进队元素,此时我们称为队满。

    3.2.2-队列的顺序存储

      队列的顺序存储是指采用一组物理上连续的存储单元来放队列中的所有元素。为了便于计算队列中的元素个数,我们约定,队头指针指向实际队头元素所在位置的前一位置,对位指针指向实际队尾元素所在的位置。

    3.2.3-顺序队列的基本操作

      (1)初始化队列函数的实现

        • 对队列空间进行初始化
        • 对队头指针进行初始化
        • 对队尾指针进行初始化

      (2)判断队列是否为空函数的实现

        • 将队头指针的值与队尾指针的值相比较
        • 若两者相等则表示当前队列为空,否则表示当前队列不为空

      (3)元素进队函数的实现

        • 判断当前队列是否有剩余空间
        • 若当前队列未满,修改队尾指针的值,使其指向队列的下一个空闲位置
        • 将要进对的元素放在上述空闲位置,进队操作完成
        • 若队满,则表示没有空间用于执行进队操作

      (4)元素出队函数的实现

        • 判断队列是否为空,若队空则无法执行出队操作,并提示队列为空
        • 若队列不为空,则修改队头指针的值,使其指向待出队元素
        • 返回待出队元素

      (5)获取队头元素的实现

        • 判断当前队列是否为空
        • 若第一步为真,则无法获取任何队头元素,此时给出队列为空的提示,并结束操作,否则执行下一步
        • 返回当前队头元素

      (6)通过用户输入数据的方式创建一个顺序队列

        • 接收用户输入
        • 若第一步为结束标志,则算法结束;否则执行下一步
        • 将用户输入的元素进队

    3.2.4-循环顺序队列的基本操作

      (1)元素进队函数的实现

      • 判断当前队列是否有剩余空间
      • 若当前队列未满,则修改队尾指针的值,使其指向队列的下一个空闲位置
      • 将要进队的元素放在上述空闲位置,进队操作完成
      • 若队满,则表示没有空闲用于执行进队操作

      (2)元素出队函数的实现

      • 判断队列是否为空
      • 若第一步为真,则无法执行出队操作,提示队列为空并返回,否则执行下一步
      • 修改队头指针的值使其指向待出队元素
      • 返回待出队元素

      (3)通过用户输入的方式创建一个循环顺序队列

      • 接收用户输入
      • 若第一步为结束标志,则算法结束,否则执行下一步
      • 将用户输入的数据元素进队

    3.2.5-队列的链式存储

      1.链式存储的基本操作

        (1)创建链式队列函数的实现

        • 创建一个新的结点
        • 初始化队头指针使其指向新结点
        • 初始化队尾指针使其指向新结点

        (2)判断队头指针和队尾指针是否为空函数的实现

        • 判断队头和队尾指针是否相等
        • 若相等则表示当前队列为空,否则表示当前队列不为空

        (3)进队函数的实现

        • 创建一个新的结点,并将待进队的元素存入该结点的数据域中
        • 将结点的地址存入队尾指针指向的结点的指针域中
        • 将队尾指针指向新结点

        (4)出对函数的实现

        • 判断队列是否为空,若队列为空,则无法执行出队操作,此时给出队列为空的提示,否则执行下一步
        • 鸡下队头指针指向的结点的下一个结点
        • 修改队头指针指向的结点的指针域,在其中存入第二步中记下结点的指针域的值
        • 判断队尾指针所在结点是否相等域第二部中记下的结点
        • 若第四步为真,则修改队尾指针,将其指向队头指针指向的结点
        • 返回出对元素

        (5)获取队头元素函数的实现

        • 判断队列是否为空
        • 若第一步为真,则无法获取队头元素,提示队列为空,并结束操作;否则执行下一步
        • 返回队头元素的值

        (6)通过用户输入数据的方式创建一个队列

        • 接收用户的输入
        • 若第一步为结束标志,则算法结束,否则执行下一步
        • 将用户输入的数据元素进队。

      2.循环链式队列

        循环链式队列是将链式队列的队尾指针所在的结点指向头结点。由于头结点的下一个结点就是队头元素所在得到位置,而队尾指针所在的结点又指向头结点,所以由队尾指针也可以找到队头元素,因此在循环链式队列中我们不需要再增设队头指针。

  3.3-递归

    3.3.1-什么是递归

      递归是数学中一个十分重要的概念,它也被大量应用在计算技术中,其特征为直接或间接调用自身,我们通常把一函数调用自身称为递归,否则称为间接递归。在算法设计中,任何间接递归都可以转化为直接递归来实现。

    

    

原文地址:https://www.cnblogs.com/yachao30/p/12175772.html

时间: 2024-10-06 12:41:05

C语言数据结构——第三章 栈和队列的相关文章

数据结构实验三《栈和队列》

<数据结构>实验三 栈和队列 一.实验目的 巩固栈和队列数据结构,学会运用栈和队列. 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作. 2.学习运用栈和队列的知识来解决实际问题. 3.进一步巩固程序调试方法. 4.进一步巩固模板程序设计. 二.实验时间 准备时间为第5周到第6周,具体集中实验时间为6周第2次课.2个学时. 三.实验内容 1.自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈.出栈.取栈元素基本操作.然后在主程序中对给定的N个数据进行验证,输出各个

数据结构期末复习第三章栈和队列

第三章:栈和队列 栈的特性:后进先出(LIFO) 1.  输入序列为ABC,可以变为CBA时,经过的栈操作为( B )A. push, pop, push, pop, push, popB. push, push, push, pop, pop, popC. push, push, pop, pop, push, popD. push, pop, push, push, pop, pop 解析: ABC经过push,push,push操作后,从栈顶到栈底元素为CBA,经过pop,pop,pop出

【知识强化】第三章 栈和队列 3.1 栈

在第三章我们将继续学习三种非常重要的线性结构,分别是栈和队列的这样的受限线性表.我们将从它们的基本概念.存储结构以及相关应用这三方面进行详细的学习.最后我们将学习数组的相关知识,大家要注意一下这里的数组指的是一种线性结构,与我们之前在程序设计语言当中提到的数组类型是不同的概念.好,数组我们会学习它的定义以及它的存储结构,还有用数组来实现矩阵的压缩存储.最后还会提一个特殊的矩阵叫做稀疏矩阵.好,这就是本章所要学习的重要考点.本章所学习的知识点其实并不难,它常常出现在选择题当中,但是在之后我们解决一

数据结构——第三章 栈

先入后出 1.栈的进出问题(题目一般只说入栈顺序,而没说啥时候出来) 2.逆波兰式(栈的后缀表示,从中缀转后缀) 例: (a+b)*3 +2 运算符在两个操作数中间,为中缀表达式 因为电脑太笨,所以需要将中缀表达式转换成后缀表达式,利用栈进行计算. 算法: 如何将中缀表达式转换成后缀表达式? 1.按执行的先后顺序,给表达式全部加上括号 2.把所有运算符移到右括号的后面 3.把所有的括号删除 例: a/b^c+d*e-a*c 1.这个式子需要这样计算 (((a/(b^c))+(d*e) )-(a*

数据结构-王道2017-第3章 栈和队列-栈和队列的应用

1.前中后缀表达式的转换: 举例说明将自然表达式转换成二叉树: a×(b+c)-d ① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树 ②然后是a×(b+c),在写时注意左右的位置关系 ③最后在右边加上 -d 然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的: ① 前序遍历:根-左-右 ② 中序遍历:左-根-右 ③ 后序遍历:左-右-根 前缀表达式:-*a+bcd 中缀表达式:a*b+c-d 后缀表达式:abc+*d- 2.队列在层次遍历二叉树中起作用,且在计算机系统中应用非

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt

第04章 栈和队列

栈 队列 优先级队列 本章涉及到的三种存储数据类型:栈 队列 优先级队列 本章涉及到的存储数据类型是算法构思的辅助工具,而不仅仅是存储数据的工具.数据结构的生命周期比较短,在程序结束时,对应的数据结构的生命周期随之结束. 栈 队列 优先级队列是比较抽象的数据结构,通过接口对三种数据结构进行定义和实现,而实现的过程对用户来说是屏蔽的. 栈 (后进先出) 栈只允许访问一个数据项,即最后插入的项,当最后一项被移除时,才能对倒数第二项进行操作,依次类推. 栈的操作有两种,入栈和出栈,push  pop.

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

【自考】数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇

学习目标 自考重点.期末考试必过指南,这篇文章让你理解什么是栈.什么是队列.什么是数组 掌握栈.队列的顺序存储结构和链式存储结构 掌握栈.队列的基本操作在顺序存储结构和链式存储结构上的实现 掌握矩阵的压缩存储 今天核心咱们先把栈搞清楚 栈和队列可以看做是特殊的线性表 .它们的特殊性表现在它们的基本运算是线性表运算的子集,它们是运算受限的线性表 栈 栈(Stack)是运算受限的线性表,这种线性表上的插入和删除操作限定在表的一端进行 基本概念 栈顶:允许插入和删除的一端 栈尾:另一端 空栈:不含任何