首页 > 其他分享 >数据结构-队列、栈

数据结构-队列、栈

时间:2024-07-20 14:30:39浏览次数:9  
标签:元素 ListNode struct 队列 队头 数据结构 size

功能受限的表结构

一、栈和队列介绍

  • 栈和队列是两种重要的线性结构,从数据结构角度,他们都是线性表,特殊点在于它们的操作被限制,也就是所谓的功能受限,统称功能受限的线性表
  • 从数据类型角度,它们也可以是看成处理、管理数据的一种规则

二、栈结构

  • 栈(stack)是限定在表尾进行数据的插入、删除等操作的线性表(只允许操作一个端口的数据)

  • 表尾称为栈顶,表头称为栈底 ,当没有元素的空表称为空栈,当元素的数量到达栈的容量时称为满栈 ,添加数据到栈顶中的动作称为入栈压栈,把数据从栈顶中拿出的动作称为出栈弹栈,正因为这个数据的添加、删除的规则,所以栈中元素满足先进后出,简称FILO表LIFO

  • 栈结构可以具备的功能

    • 创建

    • 销毁

    • 是否满栈

    • 是否空栈

    • 入栈

    • 出栈

    • 查看栈顶元素

    • 查看元素数量

      注意:只有顺序栈才有需要判断栈是否满

1、栈结构的顺序实现

//  设计顺序栈结构
typedef struct ArrayStack {
    TYPE* ptr;      //  存储栈元素的内存首地址
    size_t cap;     //  栈的容量
    size_t top;     //  栈顶的位置 
} ArrayStack;

代码实现

2、栈结构的链式实现

#define TYPE int

typedef struct ListNode {
    TYPE data;
    struct ListNode* next;
} ListNode;

//  链式栈结构
typedef struct ListStack {
    ListNode* top;      // 栈顶指针 指向栈顶节点
    size_t size;        // 节点数量
} ListStack;

代码实现

3、栈的应用

  • 内存管理,例如栈内存,之所以叫栈内存因为它遵循栈的先进后出原则,函数调用、函数参数的传参、定义,先把数据入栈,等结束时,逆序出栈,函数的调用、结束跳转也是遵循栈结构原则
  • 特殊的算法:算术表达式的转换(中缀表达式转后缀表达) 、进制转换、迷宫算法

三、队列结构

1、队列介绍

  • 与栈结构相似的是,也只允许在端口处进行添加、删除操作,但是有两个端口,一个负责添加数据,称为入队 ,该端口称为队尾,另一个端口只负责删除数据,称为出队,该端口称为队头,属于一种先进先出结构,称为FIFO

2、队列所具备的功能

  • 创建队列
  • 销毁队列
  • 判断队空
  • 判断队满 (只有顺序存储时才有)
  • 入队
  • 出队
  • 查看队头元素
  • 查看队尾元素
  • 队列元素数量

3、队列的链式实现

#define TYPE int

typedef struct ListNode {
    TYPE data;
    struct ListNode* next;
} ListNode;

//  设计链式队列结构
typedef struct ListQueue {
    ListNode* front;    //  队头
    ListNode* rear;     //  队尾
    size_t size;        //  节点数量
} ListQueue;

代码实现

4、队列的顺序实现

  • 顺序队列的队尾下标rear会随着入队而增大rear+1,队头下标front会随着出队增大front+1,因为是顺序结构,就有随着入队和出队的进行,可能超出有效的下标范围,如果不进行处理,那么队列无法重复使用。
  • 为了避免这种情况,当队尾、队头下标达到存储空间的末尾时,要想办法让它们回到内存的开头位置,相当于把内存想象成一个环形,从而可以循环使用队列,这样的队列称为循环队列
    • 因此当队尾、队头下标增加时,都要对队列的容量求余
    • rear = (rear+1)%cap
    • front = (front+1)%cap

带计数器版本的循环队列

  • 很直接地解决了元素数量的问题
  • 可以直接解决队空、队满的判断矛盾问题
  • 但是在队列结构中会多增加一个数据项,并且每次入队、出队操作都要对其进行修改
typedef struct ArrayQueue {
    TYPE* ptr;      //  存储元素的内存首地址
    size_t cap;     //  容量
    size_t cnt;     //  元素个数  计数器
    int front;      //  队头下标
    int rear;       //  队尾下标
} ArrayQueue;

代码实现

不带计数器的版本

代码实现

标签:元素,ListNode,struct,队列,队头,数据结构,size
From: https://www.cnblogs.com/sleeeeeping/p/18313053

相关文章

  • 栈和队列专题
    1,栈1.1栈的概念及结构栈是一种特殊的线性表,只允许在固定的一段进行插入和删除元素操作,这就很类似于我们生活中的羽毛球桶,进行数据插入和删除操作的一端叫栈顶,另一端叫栈底。栈中的元素遵守先进后出,后进先出的原则。压栈:栈的插入出栈,栈的删除,这两部操作都在栈顶。静态栈可......
  • 【数据结构】ArrayList与顺序表
    目录1.前言2.顺序表2.1定义一个IList接口2.2实现接口功能2.3自定义异常类2.4主程序代码3.ArrayList3.1ArrayList简介3.2ArrayList的构造3.3ArrayList常见操作3.4ArrayList的遍历 4.ArrayList的具体使用4.1简单的洗牌算法4.2杨辉三角  5.总结1.前言通过上......
  • 《数据结构》--顺序表
    C语言语法基础到数据结构与算法,前面已经掌握并具备了扎实的C语言基础,为什么要学习数据结构课程?--我们学完本章就可以实践一个:通讯录项目简单了解过后,通讯录具备增加、删除、修改、查找联系人等操作。要想实现通讯录项目必须有两个技术关键:(1)C语言语法基础(2)数据结构之顺序表/......
  • 数据结构(00)
    1.序:`数据结构`将与`菜鸟的Leetcode之路`不定时更新,也是一个系列的内容,将会包含许多的数据的逻辑结构,物理结构,数据运算。(具体怎么说,我也不太明白,我的理解是:对于不同类型数据,进行不同的排序和存储,通过指针和数组,方便后续算法对其`增加,删除,修改,查询`。)呃,正如英雄哥所言:数据结构......
  • 山东大学数据结构与算法实验8散列表(线性开型寻址/链表散列)
    A : 线性开型寻址题目描述要求使用线性开型寻址实现描述给定散列函数的除数D和操作数m,输出每次操作后的状态。有以下三种操作:插入x,若散列表已存在x,输出“Existed”,否则插入x到散列表中,输出所在的下标。查询x,若散列表不含有x,输出“-1”,否则输出x对应下标。......
  • 数据结构-线性表、链表
    一、线性表介绍1、线性结构​ 在数据元素存在非空有限集中:存在唯一的一个被称为“第一个”的数据元素存在唯一的一个被称为“最后一个”的数据元素除了第一个外,集合中每个数据元素都只有一个前趋元素除了最后一个外,集合中每个数据元素都只有一个后继元素2、线性表线性表......
  • PYTHON学习笔记(六、python数据结构--字典)
    (3)dict字典字典数据类型的含义是:根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成对应的关系。1、字典的创建方式1)使用{ }直接创建字典使用{ }创建字典的语法结构如下:d={key1:value1,key2:value2......}例如:#使用{}创建字典d=......
  • 数据结构:栈
    数据结构:栈满足栈的特性,只有先进后出的特性,不能遍历,也就不能遍历打印,也不能随机访问。栈栈:栈是在处理数据时是先进后出、就是先进栈的数据最后一个出栈、最后一个进栈的数据第一个出栈、栈就类似于给一把手枪弹夹压子弹,给弹夹压子弹的顺序就如同数据进栈的顺序,第一颗子......
  • 数据结构(队列)
    文章目录一、概念与结构二、队列的实现QueueNode.hQueue.c初始化判断队列为空队尾,入队列队头,出队列取队头数据取队尾数据取队列有效元素个数销毁队列test.c一、概念与结构......
  • 数据结构_排序
    目录一、排序二、插入排序2.1直接插入排序2.2希尔排序三、选择排序3.1直接选择排序3.2堆排序四、交换排序4.1冒泡排序4.2快速排序五、归并排序六、排序算法分析总结一、排序排序:就是使一串记录序列,按照其中某个或某些关键字的大小,进行递增或递减的排列......