[C/C++]数据结构 栈和队列()

一:栈

1.1 栈的概念及结构

        栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守先进后出的原则.

  •         压栈:栈的插入操作叫做进栈/压栈/入栈,将数据插入栈顶
  •         出栈:栈的删除操作也叫出栈,出数据也在栈顶

1.2栈的实现

        栈的实现一般可以用数组或者链表实现,相对而言数组的结构更优一点,因为数组在尾上插入数据的代价更小 ,链表则需从头遍历到尾

支持动态增长的栈:

typedef int STDataType;
typedef struct stack
{int* a;int top;  //用于维护栈顶int capacity;//栈的容量
}ST;

常用功能接口:

//栈的初始化
void STInit(ST* ps);
//压栈
void STPush(ST* ps,STDataType x);
//出栈
void STPop(ST* ps);
//取栈顶元素
STDataType STTop(ST* ps);
//判断栈是否为空
bool STEmpty(ST* ps);
//求栈的大小
int STSize(ST* ps);
//摧毁栈
void STDestroy(ST* ps);

1.栈的初始化

        要注意栈结构中的top可以初始化为0也可以初始化为-1,这里以初始化为0为例

  • 初始化为0: top的值可以表示栈元素的个数
  • top初始化位-1: top指向栈顶元素
void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

2.压栈

void STPush(ST* ps, STDataType x)
{assert(ps);//扩容if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* ret = (STDataType*)realloc(ps->a,sizeof(STDataType)*newcapacity);if (ret == NULL){perror("realloc");return;}ps->a = ret;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}

3.出栈

void STPop(ST* ps)
{assert(ps); assert(ps->top); //确保栈中还有元素ps->top--;
}

4.取栈顶元素

STDataType STTop(ST* ps)
{assert(ps);assert(ps->top);return ps->a[ps->top - 1];
}

5.判断栈是否为空

bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

6.求栈的大小

int STSize(ST* ps)
{assert(ps);return ps->top;
}

7.摧毁栈

void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a == NULL;ps->top = ps->capacity = 0;
}

二. 队列

2.1 队列的概念及结构

        队列只允许一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点,进行插入操作的一端称为队尾,进行删除操作的一端称为队头.

2.2 队列的实现

        队列也可以用数组和链表的结构实现,使用链表的结构实现会更优一点,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低.

队列的结构:

typedef int QDataType;//链式结构:表示队列
typedef struct QueueNode {QDataType x;struct QueueNode* next;
}Node;//队列的结构:队头和队尾分别用head和tail指针维护
typedef struct Queue
{Node* head;Node* tail;int size;
}Queue;

接口:

//队列的初始化
void QueueInit(Queue* ps);
//入队列
void QueuePush(Queue* ps,QDataType x);
//出队列
void QueuePop(Queue* ps);
//判断队列是否为空
bool QueueEmpty(Queue* ps);
//取队头元素
QDataType QueueFront(Queue* ps);
//取队尾元素
QDataType QueueTail(Queue* ps);
//求队列大小
int QueueSize(Queue* ps);
//摧毁队列
void QueueDestory(Queue* ps);

1.队列的初始化


void QueueInit(Queue* ps)
{assert(ps);ps->head = ps->tail = NULL;ps->size = 0;
}

2.入队列

void QueuePush(Queue* ps, QDataType x)
{assert(ps);//创建新节点Node* newnode = (Node*)malloc(sizeof(Node));if (newnode == NULL){perror("malloc");return;}newnode->next = NULL;newnode->x = x;//尾插if (ps->tail == NULL){ps->head = ps->tail = newnode;}else{ps->tail->next = newnode;ps->tail = ps->tail->next;}ps->size++;
}

3.出队列

void QueuePop(Queue* ps)
{assert(ps);assert(ps->head);if (ps->head->next == NULL){ps->head = ps->tail = NULL;}else{Node* next = ps->head->next;free(ps->head);ps->head = next;}ps->size--;
}

4.判断队列是否为空

bool QueueEmpty(Queue* ps)
{assert(ps);return ps->tail == NULL;
}

5.取队头元素

QDataType QueueFront(Queue* ps)
{assert(ps);assert(ps->head);return ps->head->x;
}

6.取队尾元素

QDataType QueueTail(Queue* ps)
{assert(ps);assert(ps->tail);return ps->tail->x;
}

7.求队列大小

int QueueSize(Queue* ps)
{assert(ps);return ps->size;
}

8.摧毁队列

void QueueDestory(Queue* ps)
{assert(ps);Node* cur = ps->head;while (cur){Node* next = cur->next;free(cur);cur = next;}ps->head=ps->tail = NULL;
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/197728.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正版软件|Soundop 专业音频编辑器,实现无缝的音频制作工作流程

关于Soundop Soundop 音频编辑器 直观而专业的音频编辑软件,用于录制、编辑、混合和掌握音频内容。 Soundop 是一款适用于 Windows 的专业音频编辑器,可在具有高级功能的直观灵活的工作区中录制、编辑和掌握音频并混音轨道。音频文件编辑器支持波形和频谱…

Unity 场景烘培 ——unity Post-Processing后处理1(四)

提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、Post-Processing是什么?二、安装使用Post-Processing1.安装Post-Processing2.使用Post-Processing(1).添加Post-process Volume&#xff08…

车载通信架构 —— 新车载总线类型下(以太网)的通信架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…

java拼图游戏(待优化)

启动类 package com.yx.ui;public class App { //启动入口public static void main(String[] args) {//如果想要开启一个界面,就创建谁的对象 // new DengJFrame(); // new ZCJFrame();new GameJFrame();}}游戏类 package com.yx.ui;import java.awt.event.KeyEv…

嵌入式 Linux 移植与系统启动方法

1、Linux系统启动与U-Boot 所谓移植就是把程序代码从一种运行环境转移到另一种运行环境。对于内核移植来说,主要是从一种硬件平台转移到另一种硬件平台上运行。 体系结构级别的移植是指在不同体系结构平台上Linux内核的移植,例如,在ARM、MI…

Evil靶场

Evil 1.主机发现 使用命令探测存活主机,80.139是kali的地址,所以靶机地址就是80.134 fping -gaq 192.168.80.0/242.端口扫描 开放80,22端口 nmap -Pn -sV -p- -A 192.168.80.1343.信息收集 访问web界面 路径扫描 gobuster dir -u http…

ForkLift:macOS文件管理器/FTP客户端

ForkLift 是一款macOS下双窗口的文件管理器,可以代替本地的访达。ForkLift同时具备连接Ftp、SFtp、WebDav以及云服务器。 ForkLift还具备访达不具备的小功能,比如从文件夹位置打开终端,显示隐藏文件,制作替换等功能。ForkLift 是一…

解决k8s node节点报错: Failed to watch *v1.Secret: unknown

现象: 这个现象是发生在k8s集群证书过期,重新续签证书以后。 记得master节点的/etc/kubernetes/kubelet.conf文件已经复制到node节点了。 但是为什么还是报这个错,然后运行证书检查命令看一下: 看样子是差/etc/kubernetes/pki/…

八股文-TCP的四次挥手

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它的连接的建立和关闭过程都是经过精心设计的。在TCP连接关闭时,使用四次挥手来保证数据的完整传输和连接的正常终止。 漫画TCP的四次挥手 第一次挥手&#…

redis安装(Windows和linux)

如何实现Redis安装与使用的详细教程 Redis 简介 Redis是一个使用C语言编写的开源、高性能、非关系型的键值对存储数据库。它支持多种数据结构,包括字符串、列表、集合、有序集合、哈希表等。Redis的内存操作能力极强,其读写性能非常优秀,且…

PyCharm:PyCharm新建.py文件时自动带出指定内容

在pycharm中加上指定内容,每次新建.py文件都会自动带出指定内容 操作: File—Setting—Editor----File and Code Templates--Python Script 在右侧窗口中加上如下信息 # encoding: utf-8 # author: Jeffrey # file: ${NAME}.py # time: ${DATE} ${TI…

ControlNet原理及应用

《Adding Conditional Control to Text-to-Image Diffusion Models》 目录 1.背景介绍 2.原理详解 2.1 Controlnet 2.2 用于Stable Diffusion的ControlNet 2.3 训练 2.4 推理 3.实验结果 3.1 定性结果 3.2 消融实验 3.3 和之前结果比较 3.4 数据集大小的影响 4.结…

聚观早报 |联想集团Q2财季业绩;小鹏汽车Q3营收

【聚观365】11月17日消息 联想集团Q2财季业绩 小鹏汽车Q3营收 微软发布两款自研AI芯片 FAA批准SpaceX再次发射星际飞船 2023 OPPO开发者大会 联想集团Q2财季业绩 全球数字经济领导企业联想集团公布截至2023年9月30日的2023/24财年第二财季业绩:整体营收达到10…

【ARM Trace32(劳特巴赫) 使用介绍 2.2 -- TRACE32 进阶命令之 DIAG 弹框命令】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 上篇文章:【ARM Trace32(劳特巴赫) 使用介绍 2.1 – TRACE32 Practice 脚本 cmm 脚本学习】 下篇文章:【ARM Trace32(劳特巴赫) 使用介绍 3 - trace32 访问运行时的内存】 文章目录 DIALOG.OK 命令DIA…

react之基于@reduxjs/toolkit使用react-redux

react之基于reduxjs/toolkit使用react-redux 一、配置基础环境二、使用React Toolkit 创建 counterStore三、为React注入store四、React组件使用store中的数据五、实现效果六、提交action传递参数七、异步状态操作 一、配置基础环境 1.使用cra快速创建一个react项目 npx crea…

持续集成交付CICD:Jenkins Sharedlibrary 共享库

目录 一、理论 1.共享库 2.共享库配置 3.使用共享库 4.共享库扩展 二、实验 1.连接共享库 2.使用共享库 三、问题 1.路径报错 2.readJSON 报错 一、理论 1.共享库 (1)概念 1)共享库这并不是一个全新的概念,其实在编…

K-Means算法进行分类

已知数据集D中有9个数据点,分别是(1,2),(2,3), (2,1), (3,1),(2,4),(3,5),(4,3),(1,5),(4,2)。采用K-Means算法进行聚类,k2,设初始中心点为(1.1,2.2),(2.3,3.…

【Web】PHP反序列化的一些trick

目录 ①__wakeup绕过 ②加号绕过正则匹配 ③引用绕过相等 ④16进制绕过关键词过滤 ⑤Exception绕过 ⑥字符串逃逸 要中期考试乐(悲) ①__wakeup绕过 反序列化字符串中表示属性数量的值 大于 大括号内实际属性的数量时,wakeup方法会被绕过 (php5-p…

Ubuntu中apt-get update显示域名解析失败

第一步 检查主机->虚拟机能否ping成功 ping 红色框中的IPv4地址 能通,表示虚拟机ip配置成功;否则,需要先配置虚拟机ip 第二步 检查是否能ping成功百度网址 ping www.baidu.com 若不成功,可能原因 虚拟机没联网,打开火狐浏览器…

别再吐槽大学教材了,来看看这些网友强推的数学神作!

作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…