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

 个人主页:深情秋刀鱼@-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.hqwc.cn/news/687796.html

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

相关文章

对camera raw中的纹理和清晰度的内容的修正(之前的内容写错了,懒得改了重新写一篇)

之前对于环的解释,不太行,这里我给出进一步地说明。 首先对环的解释: 我这里说的环指的是频域段中的ai变化的时候对图像像素的变化的极大的影响程度的环状效果,会出现不规则的环状的提亮或增暗的效果。实际上是每个fj都有影响,但…

《数据结构与算法之美》学习笔记一

前言:今天开始学习极客时间的课程《数据结构与算法之美》。为撒要学习这个?因为做力扣题太费劲了,自己的基础太差了!所以要学习学习。开一个系列记录一下学习笔记。认真学吧,学有所获才不负韶华!之前就学过…

[蓝桥杯]真题讲解:AB路线(BFS+分层图)

[蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #define INF …

现场工程师出手--虚拟化软件预留内存过大导致其他程序崩溃问题

项目场景&#xff1a; 一位学生有一台笔记本电脑&#xff0c;安装了Android&#xff0c;Kafka虚拟机很多软件。笔记本配置了20GB内存&#xff0c;固态硬盘&#xff0c;但最近很卡&#xff0c;Android Stuido经常闪退&#xff0c;一些游戏也无法运行。 问题描述 由于Android S…

【python量化交易】qteasy使用教程05——创建第一个自定义交易策略

创建第一个自定义交易策略 使用qteasy创建自定义交易策略开始前的准备工作本节的目标自定义策略的实现方法使用 qteasy 的 Strategy 策略类三种不同的自定义策略基类定义一个双均线择时交易策略定义策略运行时机定义策略需要的数据自定义交易策略的实现&#xff1a;realize()获…

电子学会C/C++编程等级考试2024年03月(四级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:最长上升子序列 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK…

自适应调节Q和R的自适应UKF(AUKF_QR)的MATLAB程序

简述 基于三维模型的UKF&#xff0c;设计一段时间的输入状态误差较大&#xff0c;此时通过对比预测的状态值与观测值的残差&#xff0c;在相应的情况下自适应调节系统协方差Q和观测协方差R&#xff0c;构成自适应无迹卡尔曼滤波&#xff08;AUKF&#xff09;&#xff0c;与传统…

【敦煌网注册/登录安全分析报告】

敦煌网注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大…

广交会资料缺了时效性有用吗?白忙活了

广交会资料开发客户有哪些难度&#xff1f; 1.如何辨别数据的真实性 展会客户真实可信&#xff0c;无需求者不会远道而来。但部分采购商为保护隐私和简便行事&#xff0c;联系方式有所保留。因此&#xff0c;数据筛选与深挖需耗费精力和耐心。 2.历史陈旧数据具备客户开发价值…

[Bug]:由于中国防火墙,无法连接 huggingface.co

问题描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

前端动画requestAnimationFrame

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数&#xff0c;该回调函数会在浏览器下一次重绘之前执行。 备注&#xff1a; 若你想在浏览器下次重绘…

《C语言文件处理:从新手到高手的跃迁》

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…