数据结构----栈和队列

(一)栈 

1.栈的概念及结构

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈。出数据也在栈顶

 

2.代码实现 

 1.栈的构成

#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;
typedef int STDateType;
typedef struct Stack
{STDateType* a;int top;int capacity;
}ST;

这里栈我使用结构体来实现,ps->top来代表栈顶ps->capacity代表一共开辟的空间用来和ps->top比较,来判断这个栈到底满没满。

2.初始化

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

3.栈的销毁 

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

记住这里free的是ps->a,而不是ps,你是让指针ps->a开辟的空间,而不是这个结构体开辟的空间,所以你要销毁指针的。

4.往栈顶存放数据

void Push(ST* ps, STDateType x)
{assert(ps);if (ps->capacity == 0){STDateType* b = (STDateType*)malloc(sizeof(STDateType) * 4);if (b == NULL){perror("malloc");exit(0);}ps->capacity = 4;ps->a = b;}if ( ps->top  == ps->capacity){STDateType newcapacity = 2 * ps->capacity;STDateType* b = (STDateType*)realloc(ps->a, newcapacity*sizeof(STDateType));if (b==NULL){perror("relloc");exit(0);}ps->a = b;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}

开始的时候栈的指针ps->a可能没有开辟空间,是第一次使用,所以我们要先确定这个情况。

ps->top==ps->capacity时,我们的ps->top已经跳到栈的外面了,这时它们正好相等,所以来通过这个判断。

这里我直接开辟一个新的指针来接收新开辟的空间,是防止直接用ps->a指针来开辟额外的空间失败后,导致ps->a=NULL,使得我们不知道原来开辟空间的地址,会造成空间的浪费。

这个函数中如果开辟失败,会跳出函数,并报错。如果开辟成功,我让指针a指向这个新的空间,并将新的空间数量给ps->capacity,将数字放入栈顶,并使得ps->top指向下一个位置。

5.取得栈顶的数值(但不对栈顶的数字进行销毁) 

STDateType  Top(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top-1];
}

这里的ps->top>0的判断,是因为当ps->top==0时,你再ps->top-1,会出现越界访问。并且只有当你放入值的时候,ps->top至少是>=1的,所以当ps->top==0时,没有放入值

6.去掉栈顶的数据

void Pop(ST* ps)
{assert(ps);if(ps->top>0)ps->top--;else{perror("Pop");exit(0);}
}

这里我们只需要将ps->top--就可以,因为当我们下一次的赋值时,这个原来的值会被覆盖。

7.判断这个栈是否为空

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

bool是用来判断的,返回值只有true与false,当ps->top==0时,就会返回true,反之为false。 

8.判断这个栈的数据个数

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

 (二).队列

1.队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

2队列的实现

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

 

 通过这些描述,我们也可以知道队列和栈非常的相似。所以我们只需要改动一下栈的代码就可以。我下面只展示需要改动的代码,如果没有改动的代码,一切与上面的一样。

1.取队列的头个值

STDateType  Top(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[0];
}

这里我只是将ps->a[]中的值改成了0。其他没有变化 

2.去掉队列头一个数值

void Pop(ST* ps)
{assert(ps);if (ps->top > 0){int i;for (i = 0; i < ps->top -1; i++){ps->a[i] = ps->a[i + 1];}ps->top--;}else{perror("Pop");exit(0);}
}

这里我用到的是覆盖的想法,将前一个与后一个进行覆盖,但是这里要注意的是i<ps->top-1,而不是ps->top。 

如果这一篇文章对你有用的话,希望得到你的三连,谢谢大家观看。

 

 

 

 

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

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

相关文章

【数据结构】十大经典排序算法总结与分析

文章目录 前言1. 十大经典排序算法分类2. 相关概念3. 十大经典算法总结4. 补充内容4.1 比较排序和非比较排序的区别4.2 稳定的算法就真的稳定了吗&#xff1f;4.3 稳定的意义4.4 时间复杂度的补充4.5 空间复杂度补充 结语 前言 排序算法是《数据结构与算法》中最基本的算法之一…

PHP Swoole实现简易聊天室,附加小程序端连接websocket简易代码

目录 用到的工具&#xff1a; PHP Swoole拓展 | PHP Redis拓展 | Redis 7 一、安装上述必要工具&#xff08;下面是以宝塔面板中操作为例&#xff09; 给PHP安装Swoole和Redis拓展&#xff1a; 安装Redis软件 二、创建websocket服务器文件"wss_server.php" 具…

19 MDIO 接口读写以太网PHY寄存器

以太网概述 以太网&#xff08;Ethernet&#xff09;是应用最普遍的局域网技术。IEEE组织的 IEEE 802.3标准制定了以太网的技术标准&#xff0c;它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网凭借其成本低、通信速率高、抗干扰性强等优点被广泛应用在网络…

2024 RSTCONCTF re 部分wp

Unknown Architect DIE查看&#xff0c;RISC_V架构&#xff0c;直接交即可 Duke of the Kingdom 附件拖入jadx 比较简单。脚本 Keypad 附件拖入ida。一共四遍check&#xff0c;都比较简单 Pico-Cypher 文本编辑器打开附件 稍微问一问gpt&#xff0c;得知这是micropython&#x…

2024年【浙江省安全员-C证】考试试卷及浙江省安全员-C证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 浙江省安全员-C证考试试卷是安全生产模拟考试一点通总题库中生成的一套浙江省安全员-C证模拟考试题库&#xff0c;安全生产模拟考试一点通上浙江省安全员-C证作业手机同步练习。2024年【浙江省安全员-C证】考试试卷及…

PostMan使用变量

环境变量 使用场景 当测试过程中&#xff0c;我们需要对开发环境、测试环境、生产环境进行测试 不同的环境对应着不同的服务器&#xff0c;那么这个时候我们就可以使用环境变量来区分它们 避免切换测试环境后&#xff0c;需要大量的更改接口的url地址 全局变量 使用场景 当…

[Leetcode LCR 154][Medium]-复杂链表的复制-链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 这道题难点在于如何处理random。因为涉及到的所有节点都在同一链表&#xff0c;因此可以在链表上利用复制-拆分的方法去做。 先在链表上把每个节点复制自身一次&#xff0c;相当于cur与cur.ne…

TCGA数据挖掘(全网最详细)

文章目录 前言一、数据处理二、数据融合3.基因ID转换4.表达差异分析5.可视化1. 筛选上下调及不显著变化的基因2.挑选top 103.火山图4. 热图4.1 上调前504.2 下调50 总结 前言 本文主要用于介绍TCGA初始数据的处理,数据融合,基因ID转换,数据融合以及数据的可视化! 一、数据处理…

评论怎么不被折叠?

首先 就很烦&#xff0c;即使我个人认为它很好 那么&#xff0c;怎么防止呢&#xff1f; 当然是 加代码框 //我是代码框 首先看看不加代码框 被撅了&#xff08; 那加上呢 没事 所以&#xff0c;这功能有什么用呢

比传统机器学习更先进的深度学习神经网络的二分类建模全流程教程

比传统机器学习更先进的深度学习神经网络的二分类建模全流程分析教程 深度学习介绍和与传统机器学习的区别 深度学习&#xff08;Deep Learning&#xff09;是一种机器学习的分支&#xff0c;基于多层神经网络模型&#xff0c;能够自动从大量数据中学习特征并进行预测。深度学…

Linux中使用Docker构建Nginx容器完整教程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

幼儿与非幼儿识别系统源码分享

幼儿与非幼儿识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

初识Linux · 进程(3)

目录 前言&#xff1a; 进程的创建 前言&#xff1a; 继上文介绍了着重介绍了进程的内部属性&#xff0c;以及在操作系统层面进程如何被组织起来的&#xff0c;如何调用系统接口&#xff0c;有关task_struct&#xff0c;进程的部分理解等&#xff0c;今天&#xff0c;我们就…

书生大模型实战营学习[1]

学习目标&#xff1a; 完成SSH连接与端口映射并运行hello_world.py 创建conda环境 学习内容&#xff1a; 完成SSH连接 使用vscode实现SSH的远程连接 首先安装Remote -SSH 接着使用ssh-keygen生成密钥 在开发机平台添加SSH 进行端口映射 创建hello_world.py来验证 impor…

杨敏博士:基于法律大模型的智能法律系统

9月26日&#xff0c;杨敏博士受邀参加人工智能助力法治化营商环境发展论坛暨得理法律大模型发布会并发表了“基于法律大模型的智能法律系统”主题演讲。杨博士是香港大学计算机博士&#xff0c;担任中科院深圳先进院高性能数据挖掘实验室主任&#xff0c;是深圳市海外高层次人才…

我又做了一个国标GB28181设备模拟器的Windows版本,让国标28181开发更简单,不用再费劲弄个摄像机来调试国标GB28181开发了

之前我搞过一个《EasyGBD国标GB28181设备端模拟器帮助测试国标GB28181平台&#xff08;EasyGBD-&#xff1e;EasyGBS&#xff09;》&#xff0c;当时&#xff0c;主要是在安卓手机上&#xff0c;用摄像机的本地摄像头来做为视频源、用摄像机的麦克风做为音频源&#xff0c;对外…

OpenSSH9.8p1编译rpm包(建议收藏)

1.升级前的openssh版本 [root@ncayu8847 ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 20172.下载软件包(离线包) openssh 源码下载地址: https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssl源码下载 https:/

十一、DMSP/OLS、NPP/VIIRS等夜间灯光数据之GDP空间化——新方法理论介绍

一、前言 之前的空间理论方法是将第一产业GDP和第二、三产业GDP分开,第一产业GDP和耕地面积进行反演,第二、三产业GDP和夜间灯光指数进行拟合,或者干脆不划分产业,就是第一、二、三产业gdp数据和夜间灯指数拟合。之前给大家介绍都是这种,那么现在很多文献提出一种新的做法…

建模杂谈系列256 规则函数化改造

说明 之前尝试用FastAPI来构造规则&#xff0c;碰到的问题是由于请求量过大(TPS > 1000), 从而导致微服务端口资源耗尽。所以现在的point是: 1 如何使用函数来替代微服务(同时要保留使用微服务的优点)2 进一步抽象并规范规则的执行3 等效合并规则的方法 内容 0 机制讨论…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset

1. 关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身。那什么是关…