【数据结构】第五讲:栈和队列

 个人主页:深情秋刀鱼@-CSDN博客

数据结构专栏:数据结构与算法

源码获取:数据结构: 上传我写的关于数据结构的代码 (gitee.com)

目录

一、栈

1.栈的定义

 2.栈的实现

 a.栈结构的定义

b.初始化

c.扩容

d.入栈

e.出栈

f.打印

g.取栈顶元素

 h.判空

i.获取栈中的元素个数

j.销毁

二、队列 

1.队列的定义

2.队列的实现

a.队列结构的定义

b.初始化

c.创建节点

d.入队

e.出队

f.队中的元素个数

g.队列判空

h.队列打印

i.取队头元素

 j.取队尾元素

 k.销毁


一、栈

1.栈的定义

        栈是一种特殊的线性表,其只允许在固定的一段进行插入和删除元素的操作。进行数据的插入和删除元素的操作的一端被称为栈顶,另一端被称为栈底。栈中的数据元素遵循后进先出LIFO(Last in First out)的原则。

 2.栈的实现

        栈的实现一般可以用数组和链表实现,一般情况下用数组实现更为合适,因为在数组尾部进行插入和删除操作的代价较小。

 a.栈结构的定义

typedef int STDataType;//定义栈结构(数组)
typedef struct Stack
{STDataType* a;  //数组栈int top;		//栈顶int capacity;   //容量
}Stack;

b.初始化

void STInit(Stack* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = -1;
}

c.扩容

void STExpan(Stack* pst)
{if (pst->top + 1 == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");return;}pst->a = tmp;pst->capacity = newcapacity;}
}

        在对栈中的数组进行扩容时,需要注意其他参数如容量(capacity)的变化,在一开始我们将capacity初始化为0,所以在这里要对capacity进行判空。

d.入栈

void STPush(Stack* pst, STDataType x)
{assert(pst);STExpan(pst);pst->top++;pst->a[pst->top] = x;
}

e.出栈

void STPop(Stack* pst)
{assert(pst && pst->top > -1);pst->top--;
}

f.打印

void STPrint(Stack* pst)
{while (!STEmpty(pst)){printf("%d ", STTop(pst));STPop(pst);}
}

g.取栈顶元素

STDataType STTop(Stack* pst)
{assert(pst && pst->top > -1);return pst->a[pst->top];
}

 h.判空

bool STEmpty(Stack* pst)
{assert(pst);return pst->top == -1;
}

i.获取栈中的元素个数

int STSize(Stack* pst)
{assert(pst);return pst->top + 1;
}

j.销毁

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

二、队列 

1.队列的定义

        队列是只允许在一端进行插入,另一端进行删除数据操作的线性表。队列中的数据元素遵循先进先出FIFO(First in First out)的原则。进行插入操作的一端称为队尾,进行删除操作的一端成为队头

2.队列的实现

         队列可以用数组和链表实现,使用链表的结构更优,因为如果使用数组,在执行出队列的操作时效率会比较低。

a.队列结构的定义

typedef int QDataType;//定义队列节点
typedef struct QueueNode
{struct QueueNode* next;		//后继指针QDataType val;			//数值
}QNode;//队列指针
typedef struct Queue
{QNode* head;			//队头指针QNode* tail;			//队尾指针int size;				//队列中的元素
}Queue;

        为了简化实现函数时参数的传递,我们额外定义一个包含一个头节点和尾节点的结构体,其中头节点和尾节点应分别指向一个链表的头和尾。

b.初始化

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

c.创建节点

QNode* QueueBuyNode(QDataType x)
{QNode* newNode = (QNode*)malloc(sizeof(QNode));if (newNode == NULL){perror("malloc fail!");exit(1);}newNode->next = NULL;newNode->val = x;return newNode;
}

d.入队

void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* node = QueueBuyNode(x);if (pq->head == NULL)	// 判空{pq->head = pq->tail = node;pq->size++;}else{pq->tail->next = node;pq->tail = pq->tail->next;pq->size++;}
}

e.出队

void QueuePop(Queue* pq)
{assert(pq && pq->head);QNode* phead = pq->head;pq->head = pq->head->next;free(phead);phead = NULL;if (pq->head == NULL)				 //队列为空	pq->tail = NULL;pq->size--;
}

f.队中的元素个数

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

g.队列判空

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}

h.队列打印

void QueuePrint(Queue* pq)
{assert(pq);if (pq->size == NULL){printf("NULL\n");return;}QNode* pcur = pq->head;while (pcur){printf("%d ", pcur->val);pcur = pcur->next;}printf("\n");
}

i.取队头元素

QDataType QueueFront(Queue* pq)
{assert(pq && pq->head);return pq->head->val;
}

 j.取队尾元素

QDataType QueueBack(Queue* pq)
{assert(pq && pq->tail);return pq->tail->val;
}

 k.销毁

void QueueDestroy(Queue* pq)
{assert(pq);QNode* pcur = pq->head;while (pcur){QNode* pnext = pcur->next;free(pcur);pcur = pcur->next;}pq->head = pq->tail = NULL;pq->size = 0;
}

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

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

相关文章

Java中常用类String的构造器与常用方法

Java中常用类String的构造器与常用方法 在Java编程中,String类是一个核心类,用于处理文本数据。掌握String类的构造器和常用方法对于编写涉及文本操作的程序至关重要。本文将为初学者介绍String类的一些常用构造器和常用方法,并通过示例代码…

Git 进行项目开发时新建一个分支作为备份

在使用 Git 进行项目开发时,想要在当前的 master 或其它分支基础上进行代码优化或修改时,并且在优化过程中保留一个当前状态的备份(即新建一个分支作为备份),然后继续在 master 分支上开发,你可以按照以下步…

乐观锁、悲观锁、互斥锁、读写锁

乐观锁和悲观锁是两种不同的锁机制,用于在多线程环境下解决资源竞争问题。互斥锁和读写锁是两种常见的锁类型,它们都可以用来实现乐观锁或悲观锁。 乐观锁 是一种无锁机制,它假设在多线程环境下对共享资源的操作不会发生冲突,因…

【CTF Crypto】XCTF GFSJ0522 base64 Writeup(Base64编码)

base64 元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气氛,是一项很有趣的活动。 你也很喜欢这个游戏,这不,今年元宵节,心里有个黑客梦的你,约上你青梅竹马…

Git泄露(续)

接上一篇补充 git config --global user.name " " git config --global user.email 邮箱地址 配置用户名和邮箱 git commit 使其处于交互区,没有使用 -m,默认用vim 来编辑和提交信息 输入要提交的内容,然后按ESC建回到命令…

华纳云:美国服务器的几种防火墙类型介绍

美国服务器的防火墙主要是用于在系统的内外网之间构建一道相对隔绝的保护屏障,用来保障美国服务器的网络安全免受恶意流量的影响,与其他地区的服务器并无本质上的不同,通常可以使用以下几种类型的防火墙: 软件防火墙:软…

「 网络安全常用术语解读 」通用配置枚举CCE详解

1. 背景介绍 NIST提供了安全内容自动化协议(Security Content Automation Protocol,SCAP)为漏洞描述和评估提供一种通用语言。SCAP组件包括: 通用漏洞披露(Common Vulnerabilities and Exposures, CVE):提供一个描述…

泰迪智能科技企业数据挖掘流程分析及特色服务优势

企业发展会沉淀大量的数据,数据中囊括了企业业务各种维度指标,通过数据挖掘和数据分析 ,让企业业务了解过去、现在和未来将要发生什么,从而更好的调整企业发展方向。泰迪智能科技企业数据挖掘平台是面向企业级用户快速处理数据构建…

C++学习第二十八课:C++ 中的智能指针详解

在 C 中,内存管理是每个程序员都需要面对的问题。在处理动态分配的内存时,如果忘记释放内存,可能会导致内存泄漏。为了解决这个问题,C11 引入了智能指针的概念。本文将详细介绍 C 中使用智能指针的方法,并结合实际案例…

并查集刷题笔记

leetcode-1971:寻找图中是否存在路径 并查集可以解决的问题是:判断两个点是否在同一个集合之中 并查集模版: 最重要的两部:将两点连接以及对某一节点寻根。 一、初始化:{init()} 将每个节点的父节点初始化为自身。 二、寻根…

nvm安装踩雷 报错‘node‘ 不是内部或外部命令

需要排查以下内容: 1.nvm install node版本号后使用nvm use node版本号进行应用 2.在安装nvm前,确保电脑上不存在之前安装过的node的相关信息,包括环境变量、之前安装的nodejs、node_global文件夹(存储全局安装的 Node.js 模块和…

永倍达 最新消息!发放消费券! 重新开网?

大家好 我是一家软件开发公司的产品经理 吴军 我又又又又又叕来蹭热度了,最近永倍达有新动作!发放消费券? 店长群最新通知 4.15号开始发放消费券 一个月之后才可以重新提现 今天是5.10号离5.18也不远了 大家拭目以待看看到底能不能提现&a…

“紧急联系人功能”的智慧守护

在当今科技融入生活的每一个角落,一款名为“蝙蝠避障”专为盲人设计的辅助应用正悄然改变着视障群体的日常出行体验。这款应用中,一个看似不起眼却至关重要的功能——“紧急联系人功能”,以其强大的实用性和人文关怀,成为了盲人朋…

一套3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用、基于C#+VC + MSSQL开发的全套PACS源码

一套3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用 PACS的功能价值在于通过连接不同的影像设备,存储与管理图像,图像的调用与后处理,实现资源共享,降低成本,达到提高工作效率、提升…

Mysql之SQL Mode问题

Mysql SQL Mode问题简谈 1. Mysql SQL Mode简介2. 常用的SQL Mode3. SQL Mode在迁移中的应用 1. Mysql SQL Mode简介 SQL Mode定义了Mysql应支持的SQL语句、数据校验等,这样可以容易在不同的环境中使用Mysql。 通过设置SQL Mode,可以完成不同严格程度的数…

halcon学习之一维测量基础

目录 创建测量矩形,获取测量句柄 gen_measure_rectangle2() 使用句柄进行测量 measure_pos() 修改参数Threshold 修改参数Transition 修改参数select 参数RowEdge,ColumnEdge,Distance …

4步快速配置Java、MySQL、Maven环境(windows)

每次入职一家新公司或者用一台其他的临时电脑或者新电脑时都要重新配置Java开发环境,很麻烦,因此我在这里记录一下快速配置环境的方式,四步搞定!此处以win为操作系统进行讲解。 第一步:下载链接 下载链接&#xff1a…

Calico 和 Flannel 区别,以及各自优缺点

Calico 和 Flannel 都是 Kubernetes 中常用的网络插件,用于在集群中提供网络通信功能,但它们有一些区别和各自的优缺点。 Calico: 特点: 基于BGP协议:Calico 使用BGP协议来实现路由,每个节点上的容器都有一…

【JavaWeb】网上蛋糕商城后台-商品管理

概念 本文讲解和实现网上蛋糕商城的后台管理系统中的商品管理功能。 商品列表 点击后台管理系统的head.jsp头部的“商品管理”功能选项,向服务器发送请求/admin/goods_list 因此需要在servlet包中创建AdminGoodsListServlet类,用于获取商品信息列表 …

linux 基础命令使用

命令 su 用于切换到另一个用户身份,通常是超级用户(root)。su命令可以用来在命令行下切换用户,也可以在脚本中使用。 语法: su [选项] [用户名] 选项: - -c:执行完命令后,立即退出su命令;…