当前位置: 首页 > news >正文

栈和队列篇

目录

一、栈

1.栈的概念及结构

1.1栈的概念

1.2栈的结构示意图

2.栈的实现

2.1支持动态增长的栈的结构

2.2压栈(入栈)

2.3出栈

2.4支持动态增长的栈的代码实现

二、队列

1.队列的概念及结构

1.1队列的概念

1.2队列的结构示意图

2.队列的实现

2.1队列的结构

2.2队尾入队列

2.3队头出队列

2.4队列的代码实现

一、栈

1.栈的概念及结构

1.1栈的概念

        栈是一种特殊的线性表。栈只允许在固定的一端进行插入和删除数据的操作,栈的插入操作叫做压栈(进栈),栈的删除操作叫做出栈,进行数据插入和删除操作的一端叫做栈顶,另一端为栈底。栈中的元素遵循先进后出的原则。

1.2栈的结构示意图

2.栈的实现

        栈一般分为静态栈和支持动态增长的栈,静态栈由于栈的空间大小固定不具实用性,所以我们只针对支持动态增长的栈进行代码实现:

2.1支持动态增长的栈的结构

        栈的实现一般使用数组形式来实现,支持动态增长的栈即开辟一个动态数组a用来存储数据,当栈的容量满了之后方便扩容。

// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;		// 栈顶int capacity;  // 容量 
}Stack;

2.2压栈(入栈)

        每次压栈首先检查栈的容量是否已满,再决定是否需要扩容,压栈的元素变为新的栈顶

// 入栈 
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 5 : (ps->capacity) * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc:");return;}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = data;ps->top++;
}

2.3出栈

        出栈后新的栈顶变为出栈前的栈顶的前一个元素

// 出栈 
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps->top--;
}

2.4支持动态增长的栈的代码实现

#pragma once
#include<assert.h>
#include<stdlib.h>
#include<stdio.h>// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;		// 栈顶int capacity;  // 容量 
}Stack;// 初始化栈 
void StackInit(Stack* ps)
{assert(ps);ps->a = NULL;ps->top = 0;//top指向栈顶的下一个位置,对top的操作需要是:先使用后++ps->capacity = 0;
}// 入栈 
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 5 : (ps->capacity) * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc:");return;}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = data;ps->top++;
}// 出栈 
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps->top--;
}// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->a[ps->top - 1];
}// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{assert(ps);return ps->top;
}// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{assert(ps);return ps->top == 0;
}// 销毁栈 
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}

二、队列

1.队列的概念及结构

1.1队列的概念

        不同于栈的概念,队列只允许在其一端进行插入数据操作,在另一端进行删除数据操作。进行插入数据操作的一端是队尾,进行删除数据操作的一端是队头。队列是一种特殊的线性表,遵循先进先出的原则。

1.2队列的结构示意图

2.队列的实现

2.1队列的结构

        队列的实现一般使用链表的结构更优:

代码:

// 队列成员节点结构
typedef int QDataType;
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 队列的结构 
typedef struct Queue
{QNode* front;QNode* rear;int size;
}Queue;

简图:

2.2队尾入队列

代码:

// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* NewNode = (QNode*)malloc(sizeof(QNode));if (NewNode == NULL){perror("malloc:");return;}NewNode->data = data;NewNode->next = NULL;if (q->size == 0){q->front = q->rear = NewNode;}else{q->rear->next = NewNode;q->rear = q->rear->next;}q->size++;
}

简图:

2.3队头出队列

代码:

// 队头出队列 
void QueuePop(Queue* q)
{assert(q);//assert(!QueueEmpty(q));if (q->front ==q->rear){if (q->front == NULL){return;}else{free(q->front);q->front = q->rear = NULL;}}else{QNode* Tmp = q->front;q->front = Tmp->next;free(Tmp);Tmp = NULL;}q->size--;
}

简图:

2.4队列的代码实现

#pragma once
#include<assert.h>
#include<stdlib.h>
#include<stdio.h>// 链式结构:表示队列成员节点
typedef int QDataType;
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 队列的结构 
typedef struct Queue
{QNode* front;QNode* rear;int size;
}Queue;// 初始化队列 
void QueueInit(Queue* q)
{assert(q);q->front = q->rear = NULL;q->size = 0;
}// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* NewNode = (QNode*)malloc(sizeof(QNode));if (NewNode == NULL){perror("malloc:");return;}NewNode->data = data;NewNode->next = NULL;if (q->size == 0){q->front = q->rear = NewNode;}else{q->rear->next = NewNode;q->rear = q->rear->next;}q->size++;
}// 队头出队列 
void QueuePop(Queue* q)
{assert(q);//assert(!QueueEmpty(q));if (q->front ==q->rear){if (q->front == NULL){return;}else{free(q->front);q->front = q->rear = NULL;}}else{QNode* Tmp = q->front;q->front = Tmp->next;free(Tmp);Tmp = NULL;}q->size--;
}// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->front->data;
}// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->rear->data;
}// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{assert(q);return q->size;
}// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)
{assert(q);return q->size == 0 ? 1 : 0;
}// 销毁队列 
void QueueDestroy(Queue* q)
{assert(q);while(!QueueEmpty(q)){QueuePop(q);}
}

相关文章:

栈和队列篇

目录 一、栈 1.栈的概念及结构 1.1栈的概念 1.2栈的结构示意图 2.栈的实现 2.1支持动态增长的栈的结构 2.2压栈&#xff08;入栈&#xff09; 2.3出栈 2.4支持动态增长的栈的代码实现 二、队列 1.队列的概念及结构 1.1队列的概念 1.2队列的结构示意图 2.队列的实…...

分享一个vue-slot插槽使用场景

需求再现 <el-table-column align"center" label"状态" prop"mitStatus" show-overflow-tooltip />在这里&#xff0c;我想对于状态进行一个三目判断&#xff0c;如果为0那就是进行中&#xff0c;否则就是已完成&#xff0c;期初我是这样写…...

Qt应用开发(基础篇)——进度对话框 QProgressDialog

一、前言 QProgressDialog类继承于QDialog&#xff0c;是Qt设计用来反馈进度的对话框。 对话框QDialog QProgressDialog提供了一个进度条&#xff0c;表示当前程序的某操作的执行进度&#xff0c;让用户知道操作依旧在激活状态&#xff0c;配合按钮&#xff0c;用户就可以随时终…...

基于SpringBoot2的后台业务管理系统

概述 SpringBoot-Plus 是一个适合大系统拆分成小系统的架构&#xff0c;java快速开发平台&#xff0c;或者是一个微服务系统。其中加入了Thymeleaf数据模板语言代替了之前的JSP页面方式。页面展示采用Layui前端框架&#xff0c;包含了用户管理&#xff0c;角色管理&#xff0c…...

Jmeter(三十):并发测试(设置集合点)

集合点:让所有请求在不满足条件的时候处于等待状态。 如:我集合点设置为50,那么不满足50个请求的时候,这些请求都会集合在一起,处于等待状态,当达到50的时候,就一起执行。从而达到并发的效果。 那么Jmeter中可以通过同步定时器 Synchronizing Timer 来完成。 Number …...

Flink的checkpoint是怎么实现的?

分析&回答 Checkpoint介绍 Checkpoint容错机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保证应用流图状态的一致性。Flink的Checkpoint机制原理来自“Chandy-Lamport alg…...

ubuntu上安装nginx

这篇文章主要介绍怎么在ubuntu上安装nginx服务器&#xff0c;并进行一些简单的配置。 第一步&#xff1a;准备好一台ubuntu操作系统的虚拟机 注意&#xff1a;如果你还没有安装好ubuntu&#xff0c;个人推荐阅读以下文章完成unbutu安装&#xff0c;vm的版本不用刻意安装文章中…...

9. 微积分 - 导数

文章目录 导数求导实例代码演示:迭代法求解二次函数最小值阶Hi, 大家好。我是茶桁。 我们终于结束了极限和连续的折磨,开启了新的篇章。 不过不要以为我们后面的就会很容易,只是相对来说, 没有那么绕而已。 那么,我们今天开始学习「导数」。 导数 在之前的导论,也就是…...

滑动窗口系列1-达标子数组

#达标子数组# 求达标子数组的数量 * 题目&#xff1a;给定一个数组&#xff0c;求满足子数组中最大值-最小值小于等于某个数的子数组的数量 * 例如[0,1,2,3]中求子数组中最大值-最小值小于等于 2的子数组的数量 * 结果为9,因为满足条件的只有[0,0] [0,1] [0,2] [1,1] [1,2] [1…...

电视显示技术及价格成本对比(2023年)

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/zaibeijixing/article/details/132461068 ———————————————— 截止到2023年&#xff…...

浅谈 Pytest+HttpRunner 如何展开接口测试!

软件测试有多种多样的方法和技术&#xff0c;可以从不同角度对它们进行分类。其中&#xff0c;根据软件生命周期&#xff0c;针对不同的测试对象与目标&#xff0c;可将测试过程分为 4 个阶段&#xff1a;单元测试、集成测试、系统测试和验收测试。本文着重介绍了如何借用 pyte…...

vue自定义事件 div 拖拽方法缩小

在main.js 引用 // 引入拖动js import dragMove from "./utils/dragMove.js" 创建 drawmove.js export default (app) > {app.directive(dragMove, (el, binding) > {const DragVindow el.querySelector(binding.value.DragVindow)// 按下鼠标处理事件con…...

使用实体解析和图形神经网络进行欺诈检测

图形神经网络的表示形式&#xff08;作者使用必应图像创建器生成的图像&#xff09; 一、说明 对于金融、电子商务和其他相关行业来说&#xff0c;在线欺诈是一个日益严重的问题。为了应对这种威胁&#xff0c;组织使用基于机器学习和行为分析的欺诈检测机制。这些技术能够实时…...

vue中axios请求篇

vue中如何发起请求? 利用axios来发起请求&#xff0c;但是前期需要配置 首先安装axios 可以使用npm、yarn等进行安装 npm安装方式 npm install axios -sava //在项目文件夹中打开cmd或者终端进行安装依赖 yarn安装方式 yarn add axios 引入axios。我一般是在src下创建一个u…...

Springboot2.0 上传图片 jar包导出启动(第二章)

目录 一&#xff0c;目录文件结构讲解二&#xff0c;文件上传实战三&#xff0c;jar包方式运行web项目的文件上传和访问处理&#xff08;核心知识&#xff09;最后 一&#xff0c;目录文件结构讲解 简介&#xff1a;讲解SpringBoot目录文件结构和官方推荐的目录规范 1、目录讲解…...

添加YDNS免费的ipv6动态域名解析

背景 又到了一年一度的dns域名到期&#xff0c;寻找替代了&#xff0c;前几年用了阿里、华为的免费域名&#xff0c;支持了几个搭建在NAS上的微服务&#xff1b;一旦涉及到域名续费&#xff0c;价格就比首年上去了不少&#xff0c;所以&#xff0c;打算找个长期的免费域名。 搜…...

爬虫异常处理之如何处理连接丢失和数据存储异常

在爬虫开发过程中&#xff0c;我们可能会遇到各种异常情况&#xff0c;如连接丢失、数据存储异常等。本文将介绍如何处理这些异常&#xff0c;并提供具体的解决代码。我们将以Python语言为例&#xff0c;使用requests库进行网络请求和sqlite3库进行数据存储。 1. 处理连接丢失 …...

KVM虚拟化ubuntu

KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种基于Linux内核的虚拟化技术&#xff0c;它将Linux内核作为虚拟机的底层操作系统&#xff0c;利用硬件虚拟化支持创建和管理虚拟机。KVM虚拟化技术被广泛应用于云计算、虚拟化服务器、虚拟化桌面等场景。 KVM虚拟…...

模拟电子技术基础学习笔记三 PN结

采用不周的掺杂工艺&#xff0c;将P型半导体与N型半导体制作在同一块硅片上&#xff0c;在它们的交界面就形成PN结。 扩散运动 物质总是从浓度高的地方向浓度低的地方运动&#xff0c;这种由于浓度差而产生的运动称为扩散运动。 空间电荷区 - 耗尽层 漂移运动 在电场力的作…...

java基础-----第七篇

系列文章目录 文章目录 系列文章目录一、什么是字节码?采用字节码的好处是什么?1.java中的编译器和解释器:2.采用字节码的好处:二、Java中的异常体系一、什么是字节码?采用字节码的好处是什么? 1.java中的编译器和解释器: Java中引入了虚拟机的概念,即在机器和编译程…...

酷安UWP桌面客户端完整指南:大屏幕高效刷酷安的终极方案

酷安UWP桌面客户端完整指南&#xff1a;大屏幕高效刷酷安的终极方案 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 还在为手机小屏幕刷酷安而感到眼睛酸痛吗&#xff1f;想在27寸大屏幕上…...

从‘Hello World’到工业通信:我的第一个C++ ADS客户端连接倍福PLC踩坑实录

从零搭建C ADS客户端&#xff1a;一位工程师的倍福PLC连接实战手记 第一次在Visual Studio里看到那个红色的编译错误时&#xff0c;我盯着屏幕足足愣了五分钟。"LNK2019: 无法解析的外部符号 __imp_AdsPortOpen"&#xff0c;这行冰冷的报错彻底击碎了我以为照着官方…...

SpinalHDL Pipeline库核心要素解析:从Stageable到流水线构建实战

1. Pipeline核心要素深度解析&#xff1a;从概念到实战在数字电路设计&#xff0c;尤其是处理器流水线这类复杂逻辑的构建中&#xff0c;我们常常需要一种更抽象、更灵活的方式来组织数据流和控制流。传统的RTL描述方式在面对多级流水、动态数据传递和复杂交互时&#xff0c;代…...

GD32F103 DAC输出不稳?排查DMA传输和定时器触发的5个常见坑点

GD32F103 DAC输出不稳&#xff1f;排查DMA传输和定时器触发的5个常见坑点 在嵌入式开发中&#xff0c;DAC&#xff08;数字模拟转换器&#xff09;的稳定输出对许多应用至关重要。然而&#xff0c;当使用GD32F103的DAC功能时&#xff0c;开发者常常会遇到输出波形不稳定、数据错…...

金属3D打印光束整形:两大路线正面PK

作为金属3D打印技术的最新发展&#xff0c;开展光束整形技术研究的企业越来越多&#xff0c;研发的进程也越来越深。3D打印技术参考注意到&#xff0c;国外由EOS引领该技术发展&#xff0c;同时还有Aconity3D和DMG Mori等行业领导者&#xff1b;在国内&#xff0c;铂力特、华曙…...

告别配置烦恼:一键脚本+环境变量,让你的Mac上Gradle(Homebrew版)和IDEA无缝协作

告别配置烦恼&#xff1a;一键脚本环境变量&#xff0c;让你的Mac上Gradle(Homebrew版)和IDEA无缝协作 作为一名长期在Mac上使用Gradle的开发者&#xff0c;你是否经历过这样的困扰&#xff1a;每次换新机器或升级Gradle版本后&#xff0c;都要手动查找libexec路径&#xff0c;…...

别再只会用RC了!手把手教你用运放搭建一个75Hz低通滤波器(附Multisim仿真文件)

从RC到运放&#xff1a;实战75Hz低通滤波器设计与Multisim验证 在电子信号处理领域&#xff0c;滤波器设计是每个工程师必须掌握的硬核技能。当你需要从嘈杂的传感器信号中提取有效信息&#xff0c;或者在音频系统中消除恼人的高频噪声时&#xff0c;一个性能优异的低通滤波器往…...

Android BroadcastReceiver 深度解析:原理、实践与面试指南

引言 在 Android 开发中,BroadcastReceiver 是一个核心组件,用于处理系统级事件或应用内通信。它允许应用程序响应来自系统或其他应用的广播消息,如设备开机、网络状态变化或自定义事件。BroadcastReceiver 基于事件驱动的模型,帮助开发者实现松耦合的架构,提升应用的响应…...

别再让PCIe性能打折扣!手把手教你用lspci和setpci调优MaxPayloadSize

PCIe性能调优实战&#xff1a;用lspci和setpci精准优化MaxPayloadSize 当你的NVMe固态硬盘突然降速&#xff0c;或者10G网卡吞吐量不及预期时&#xff0c;可能正遭遇PCIe链路层的隐形性能杀手。本文将带你用Linux系统自带的lspci和setpci工具&#xff0c;像专业工程师一样诊断和…...

使用Python快速上手Taotoken实现你的第一个大模型对话

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Python快速上手Taotoken实现你的第一个大模型对话 对于刚接触大模型API的Python开发者而言&#xff0c;最直接的入门方式就是编…...