数据结构——栈的模拟实现

ops/2024/12/15 17:36:12/

大家好,今天我要介绍一下数据结构中的一个经典结构——栈。

一:栈的介绍

与顺序表和单链表不同的是:

顺序表和单链表都可以在头部和尾部插入和删除数据,但是栈的结构就锁死了(栈的底部是堵死的)栈只能从栈顶插入(数据入栈)和删除(数据出栈)数据————last in first out(后进先出)(最后入栈的数据要第一个出栈)。

如果进栈过程中不允许出栈:入栈 1 2 3 4————出栈4 3 2 1

二:栈的概念和结构

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

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

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

来看一道经典的练习题:

这道题目看到进栈顺序是1 2 3 4,很多人会直接想到出栈顺序为 4 3 2 1.

但是答案中却没有4 3 2 1 

我们仔细读题:

题目要找不可能的出栈顺序,说明四个选项中有三个选项都是可能的出栈顺序。

在进栈过程中允许出栈的前提下,一种进栈顺序是可以对应出多种出栈顺序的。

这种题目的解法就是模拟实现上面的情境,以D选项为例:

3 4 2 1的出栈顺序

可以先入1 2 3,再出3,再入4,再出4,最后出2 1.

三:栈的模拟实现

栈的结构只能从栈顶插入和删除数据(我们在实现的过程中以数组或者链表的尾部当栈顶)。(头部当栈顶的话数组就麻烦了)。

栈的模拟实现使用数组或者单链表都是可以的,相对而言数组的结构实现更优一些。因为在数组尾部插入数据的代价比较小。

链表的话在尾部插入数据如果定义一个尾指针的话还是容易做到的,但是如果链表删除尾部数据的话还是要从头指针进行遍历的(单链表不可逆)(尾指针不容易找到其前一个结点)(使用双向链表就有点麻烦了)。(要是真的愿意使用链表的方式实现也是可以的,自己下去可以尝试)。

综上:

我们今天使用数组来实现栈这一数据结构,数组的尾部作为栈顶。

0.栈的结构的定义

这里我们还是使用动态内存栈。

1.栈的初始化

栈的模拟实现实际上跟顺序表很相似,甚至比顺序表还要简单。

这里值得说明的就是:

1.在初始化的过程中先给上数组4个存储空间,后面不够的话在添加。

2.程序的第17行top的含义是指向栈顶元素的下一个位置(初始情况下栈中没有数据top的下表就先为0).(这样的话方便后续数据入栈)。

当然这里也可以让top指向栈顶元素(初始时栈中没有元素就先指向-1,栈中插入数据之后,top就是栈顶元素的下表)

两种方式都可以,看自己平时的习惯即可(你用哪种方式实现后续操作要保持一致)。

2.插入数据(数据入栈)

插入数据首先要判断空间是否够用,不够的话扩容(二倍扩容法)。

3.删除栈顶数据(数据出栈)

删除数据之前要断言是否有数据可删(否则会有越界的风险)

未完待续……


http://www.ppmy.cn/ops/142168.html

相关文章

API成批分配漏洞修复

使用jackson增加全局序列化方式,校验所有接口入参,判断是否包含多余入参,比如原本后端接收的入参为: { ​"name":"张三", ​"age":"22", ​"high":"183" ​ } 如果前端传参多…

spring cloud contract http实例

微服务很多时,服务之前相互调用,接口参数的一致性要变得很难维护。 spring cloud contract 提供了测试接口一致性的方法。 一 项目配置 plugins {id "groovy"id "org.springframework.cloud.contract" version "4.0.5"i…

FFmpeg功能使用

步骤:1,安装FFmpeg Download FFmpeg 在这里点击->Windows builds from gyan.dev;如下图 会跳到另外的下载界面: 在里面下拉选择点击ffmpeg-7.1-essentials_build.zip: 即可下载到FFmpeg; 使用&#…

使用html 和javascript 实现微信界面功能1

1.功能说明: 搜索模块: 提供一个搜索框,但目前没有实现具体的搜索功能。 好友模块: 在左侧的“好友”部分有一个“查看好友”按钮。点击左侧的“查看好友”按钮时,会在右侧显示所有好友的列表。列表中每个好友可以点击查看详情,包…

网络安全教学博客(二):常见网络安全威胁剖析

在上一篇博客中,我们了解了网络安全的基础概念和重要性。今天,让我们深入探讨一下常见的网络安全威胁,以便我们能够更好地识别和防范它们。 恶意软件(Malware) 病毒(Virus):病毒是一…

vue +element 导入导出 文件太大,导致超时问题

今天遇到一个问题就是数据量过大时候一次性导入导出会出现一直加载问题,原本我修改了针对这两个接口不限制请求超时时间,发现没有用 // 导入 export function importSaleorder(data) {return request({url: xnkj/order/saleorder/importSaleorder,heade…

负载均衡,高可用,监控服务搭建总结

LVS-NAT1.装ipvsadm包2.配置内核参数开启路由转发功能:/etc/sysctl.conf3.搭建lvs-nat负载均衡服务(添加虚拟服务器和真实服务器)LVS-DR1.装ipvsadm和network-scripts包2.调整内核参数设置arp_ignore和arp_annunce3.配置虚拟网卡,实现共享ip:/etc/sysconfig/network-scripts/4.…

httpsok-v1.18.0-SSL证书自动续期

🔥httpsok-v1.18.0-SSL证书自动续期 介绍 httpsok 是一个便捷的 HTTPS 证书自动续期工具,基于全新的设计理念,专为 Nginx 、OpenResty、Apache 等服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分…