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

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java医院绩效管理应用系统源码java+ maven+ avue 公立医院绩效考核管理系统源码 支持二开

Java医院绩效管理应用系统源码java maven avue 公立医院绩效考核管理系统源码 支持二开 医院绩效管理系统解决方案紧扣新医改形势下医院绩效管理的要求,以“工作量为基础的考核方案”为核心思想,结合患者满意度、服务质量、技术难度、工作效率、医德医风…

Java入门基础学习笔记16——运算符

package cn.ensource.operator;public class OperatorDemo1 {public static void main(String[] args) {// 目标:掌握基本的算术运算符的使用int a 10;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b); // 20System.out.…

Pandas DataFrame行迭代:初学者指南

在数据分析中,Pandas是一个强大的Python库,它提供了快速、灵活以及表达力强的数据结构,旨在使“关系”或“标签”数据的操作既简单又直观。对于初学者来说,理解如何迭代DataFrame的行是一项基础但重要的技能。本文将通过通俗易懂的…

一文讲透亚马逊云三层架构

关于三层架构,我们有很多想说的话: (以下内容以下都在VPC中) cloudfront做CDN加速网关规划S3做静态网站托管APIGateway作为统一网关入口认证/限流Lambda 作为传统后端,并发,底层架构Redis缓存DDB作为持久化…

CH340 RTS DTR引脚编程驱动OLED

运行结果 硬件连接(在连接线上串接300R电阻) 下面是c#实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks;using uint8 System.Byt…

5月10日学习记录

[NCTF2019]True XML cookbook(xxe漏洞利用) 这题是关于xxe漏洞的实际应用,利用xxe漏洞的外部实体来进行ssrf探针内网的主机 和[NCTF2019]Fake XML cookbook的区别就在于xxe漏洞的利用方向,一个是命令执行,一个是SSRF 看题,打开…

26、Flink 的状态数据结构升级

状态数据结构升级 a)概述 Flink 流应用通常被设计为永远或者长时间运行,与所有长期运行的服务一样,应用程序需要随着业务的迭代而进行调整,应用所处理的数据 schema 也会随着进行变化。 升级状态类型的数据 schema &#xff0c…

【redis】Redis五种常用数据类型和内部编码,以及对String字符串类型的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

ORACLE ODAX9-2的一个误告警Affects: /SYS/MB的分析处理

在运维的多套ORACLE ODAX9-2版本,都遇到了一个计算节点的告警:Description: The service Processor poweron selftest has deteced a problem. Probabity;:100, UulD:cd1ebbdf-f099-61de-ca44-ef646defe034, Resource:/SYS/MB,;此告警从描述上…

React 第三十一章 虚拟DOM

面试题:什么是虚拟DOM?其优点有哪些? 标准且浅显的答案 虚拟dom本质上就是一个普通的 JS 对象,用于描述视图的界面结构 虚拟 DOM 最早是由 React 团队提出来的,因此 React 团队在对虚拟 DOM 的定义上面有绝对的话语权。…

【Linux】基础命令,文件处理,用户,vim编辑器,文件压缩

常用命令及参数:dir表示文件夹,file表示文件(file可表示其他目录下的文件) pwd命令;查看当前所属文件夹(print working directory) ls [选项] dir;查看当前、指定文件夹目录内容&am…

以太网技术介绍

随着通信和计算机技术的不断发展,无论是骨干网还是接入网,以太网都已成为应用场景最多,应用范围最广泛的技术之一。对于初次应用以太网的读者,本文主要给出以太网技术的基础知识,并对以太网涉及的部分协议进行简要说明…

硕博电子洗扫车电控系统:让洗扫更智能,更高效!

硕博电子洗扫车电控系统以7寸显示屏、移动控制器、操作面板为核心,具有8~ 32V DC宽压输入、耐震动、抗冲击、耐腐蚀、高防护等特性。三个主要核心元件与副发动机、底盘和、GPS 模块等均通过CAN 总线进行通信,交互数据,通信稳定可靠&#xff0…

镭速实现利用Libarchive实现高效、智能的文件传输和管理

在前一篇报道中,我们阐述了Libarchive这一开源库的强大功能,它专门用于处理归档文件。通过整合Libarchive,镭速在包括Windows和Linux在内的多个操作系统上提供了在线解压缩服务,为企业构建了一个既强大又安全的文件传输系统&#…

常见排序算法——希尔排序

基本原理 希尔排序在插入排序的基础之上,将待排序序列分成组,分成 gap 个组,组的数量通过 length / 2 获得,比如6个元素的序列,那么就是 3 个组,每个组两个元素,然后将每个组的元素进行插入排…

Threejs加载MMD

MMD全称MikuMikuDance,是一个简单的做动画的程序,做MMD之前先了解下什么是PMD。 PMD(Polygon Model Data)文件是一种用于描述三维模型的文件格式。PMD 文件通常用于 MikuMikuDance(MMD)软件,它是…

Bpmn.js使用(仅查看版)

Bpmn.js使用&#xff08;仅查看版&#xff09; 下载 npm install bpmn-js创建一个 Dom 节点来挂载画布元素。 <a-tabs v-model:activeKey"activeKey" change"tabsChange"><a-tab-pane key"1" tab"审批记录"><a-tabl…

【二叉树】Leetcode 二叉树的锯齿形层序遍历

题目讲解 103. 二叉树的锯齿形层序遍历 算法讲解 这道题其实是和N叉树层序遍历是一样的&#xff0c;只不过是要求每一次的遍历的方向不一样&#xff1b;注意&#xff1a;这一次的使用的队列不能够是queue了&#xff0c;因为需要从后往前遍历容器&#xff0c;所以就可以使用v…

[已解决]ModuleNotFoundError: No module named ‘einops‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

腾讯互娱面经,希望别凉

面试题详解 Go接口 接口在Golang中扮演着连接不同类型之间的桥梁&#xff0c;它定义了一组方法的集合&#xff0c;而不关心具体的实现。接口的作用主要体现在以下几个方面&#xff1a; 多态性: 接口允许不同的类型实现相同的方法&#xff0c;从而实现多态性。这意味着我们可…