数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)


前言:在前面的文章中,我们讲解了顺序表,单链表,双向链表。而我们今天要分享的栈则是基于之前的数据结构上搭建的,但是相较于顺序表和链表来说,栈的实现就非常简单了。

目录

一.栈(Stack)的概念

二.栈的数据结构

三.栈的实现

判断栈已满

判断栈非空

入栈push

出栈pop

查看栈顶元素

完整代码

Java版本

c语言版


一.栈(Stack)的概念

栈是一种先进后出(LIFO)的数据结构,在其中元素的的添加(称为“入栈”)和删除(称为“出栈”)仅在栈的顶部进行。因此,最后一个插入到栈中的元素是第一个从栈中删除的元素。

它通常有两个主要操作:

  • push:在栈的顶部插入一个元素。
  • pop:从栈的顶部移除一个元素。

栈的push入栈图解:

栈的pop出栈图解 :

我们可以看见对于栈的操作,我们都是在栈顶上操作的,先进来的元素会被后面的元素覆盖,而最后一个进来的元素也就是栈顶,因此我们称为先进后出(LIFO)

像传统的狙击步枪的弹夹就属于是一种栈的结构 


二.栈的数据结构

对于栈的实现,我们通常使用数组,当然也可以使用链表,不过相对而言数组的实现是更容易的。

而对于一个栈的数据结构,他首先得有存放元素的位置,我们这里选择用数组来存放,其次还得有栈内元素个数的记录:

public class MyStack {public int[] elem;public int usedSize;
}

三.栈的实现

对于一个栈,他应该有以下这些功能:

  • 入栈
  • 出栈
  • 判断栈是否为空
  • 判断栈已满
  • 查看栈顶元素

判断栈已满

当已经使用的数组的大小等于数组本身的大小的时候,栈就相当于满了

    public boolean isFull() {return usedSize == elem.length;}

判断栈非空

当数组内一个元素都没有,也就是已经使用的数组大小为0的时候,栈就是空的

    public boolean isEmpety() {return usedSize == 0;}

入栈push

当我们要将元素放入栈内的时候,先进行判断,只有在栈内还有剩余空间的情况下,我们才会进行入栈操作,如果没有剩余空间,我们就进行扩容

    public void push(int val) {if (isFull()) {//扩容elem = Arrays.copyOf(elem, elem.length * 2);}elem[usedSize++] = val;}

出栈pop

出栈前要先进行判断,如果栈内一个元素都没有,那自然是不能进行出栈操作的,我们就抛出一个自定义异常然后抛出;对于正常的出栈操作,我们拿出栈顶的元素,然后让记录数组的个数减一

    public int pop() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}int popNumber = elem[usedSize-1];usedSize--;return popNumber;}

查看栈顶元素

和出栈不一样的是,查看栈顶元素只是将元素拿出来展示,并没有实际上删除这个元素

    public int peek() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}return elem[usedSize - 1];}

完整代码

栈的整体实现相较于顺序表和链表是非常简单的,这里附上完整代码

Java版本

import java.util.Arrays;public class MyStack {public int[] elem;public int usedSize;public static int DEFULT_SIZE = 10;public MyStack() {this.elem = new int[DEFULT_SIZE];}public void push(int val) {if (isFull()) {//扩容elem = Arrays.copyOf(elem, elem.length * 2);}elem[usedSize++] = val;}public int pop() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}int popNumber = elem[usedSize-1];usedSize--;return popNumber;}public int peek() {if (isEmpety()) {//栈为空,无法出栈throw new EmptyStackException("栈为空,无法弹出");}return elem[usedSize - 1];}public boolean isFull() {return usedSize == elem.length;}public boolean isEmpety() {return usedSize == 0;}}

c语言版

#include <stdio.h>
#include <stdlib.h>#define STACK_SIZE 10// 定义栈结构体
typedef struct {int data[STACK_SIZE];  // 存放数据的数组int top;               // 栈顶指针
} Stack;// 初始化栈
void init_stack(Stack *s) {s->top = -1;  // 栈顶初始化为-1
}// 判断栈是否为空
int is_empty(Stack *s) {return s->top == -1;
}// 判断栈是否已满
int is_full(Stack *s) {return s->top == STACK_SIZE-1;
}// 入栈
void push(Stack *s, int value) {if (is_full(s)) {printf("Stack overflow\n");exit(1);}s->data[++s->top] = value;  // 栈顶指针先加1,再将元素入栈
}// 出栈
int pop(Stack *s) {if (is_empty(s)) {printf("Stack underflow\n");exit(1);}return s->data[s->top--];  // 先将元素出栈,再将栈顶指针减1
}// 获取栈顶元素
int peek(Stack *s) {if (is_empty(s)) {printf("Stack underflow\n");exit(1);}return s->data[s->top];
}



  本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

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

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

相关文章

算法设计复习题

一、选择 1.算法要对异常情况进行适当的处理&#xff0c;就是算法的&#xff08;&#xff09;。 A、正确性 B、可用性 C、健壮性 D、可行性 2.&#xff08; &#xff09;指的是算法中描述的操作都可以通过已经实现的基本操作运算有限次实现。 A、可靠性 B、正确性 C、有效性 …

一些好的写法

1.多状态返回 <text class"card-left-tag-text" >{{ {0: 未交班, 1: 未接班, 2: 已完成, 3: 已延期}[items.turnoverType] }} </text> 2.年月拼接&#xff0c;pre,cur,next let date new Date();let year date.getUTCFullYear()let month date.getU…

windows下docker环境安装

开启硬件虚拟化技术 win10中开启 Hyper-V Win10 下是否开启硬件虚拟化技术&#xff0c;在控制面板&#xff0c;启用 window 功能&#xff0c;找到 Hyper-V 选项&#xff0c;点勾选确认。如图&#xff1a; Windows 11 家庭中文版新增 Hyper-V选项 注意以下的解决方案来自win1…

FFmpeg之AVHWAccel

这也是ffmpeg解码器中比较重要的一个模块&#xff0c;很多人认识它应该是通过一条命令 ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4命令地址&#xff1a;英伟达ffmpeg 大家可能觉得这就是nvcodec了&#xff0c;后来发…

PS不按比例裁剪图片

点击左侧的裁剪工具后&#xff0c;然后点击底部工具栏中的清除选项。

关于论坛中 Edge 问题解决教程汇总

常见问题 使用 Microsoft Edge 浏览器时&#xff0c;可能会遇到一些具体的问题&#xff0c;以下是一些常见问题及可能的解决方法&#xff1a; 1. 页面加载缓慢&#xff1a; 解决方法&#xff1a; 检查网络连接&#xff1a;确保网络连接稳定。清除浏览器缓存&#xff1a;打开…

【docker】容器使用(Nginx 示例)

查看 Docker 客户端命令选项 docker上面这三张图都是 常用命令&#xff1a; run 从映像创建并运行新容器exec 在运行的容器中执行命令ps 列出容器build 从Dockerfile构建映像pull 从注册表下载图像push 将图像上载到注册表…

【51单片机】俄罗斯方块游戏-LED点阵

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用51单片机控制器&#xff0c;使88LED点阵&#xff0c;按键等。 主要功能&#xff1a; 系统运行后&#xff0c;88LED点阵显示游戏界面&#xff0c;K1和K2键控制左右移动&#xff0c;K3和K4键控制…

【产品经理】产品的实现,需要做好战略规划

产品的实现需要做好产品规划&#xff0c;而产品的规划决定了产品的方向。本文从战略规划的重要性、产品定位、设计产品架构图三个方向&#xff0c;详细地为大家梳理了产品实现的前期准备。 我们知晓了如何去发掘问题&#xff0c;并找到解决方案。 可对于问题的处理&#xff0c…

Qt Desktop Widgets 控件绘图原理逐步分析拆解

Qt 是目前C语言首选的框架库。之所以称为框架库而不单单是GUI库&#xff0c;是因为Qt提供了远远超过GUI的功能封装&#xff0c;即使不使用GUI的后台服务&#xff0c;也可以用Qt大大提高跨平台的能力。 仅就界面来说&#xff0c;Qt 保持各个平台绘图等效果的统一&#xff0c;并…

diffusers pipeline拆解:理解pipelines、models和schedulers

diffusers pipeline拆解&#xff1a;理解pipelines、models和schedulers 翻译自&#xff1a;https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline v0.24.0 diffusers 设计初衷就是作为一个简单且易用的工具包&#xff0c;来帮助你在自己的使用场景中构建…

将List<Map<String,Object>>转为List<Object>

经常在开发中会需要将List<Map<String&#xff0c;Object>>转为List&#xff0c;Object也就是你自己对应的目标对象&#xff0c;因为经常要用&#xff0c;干脆就自己封装了一个&#xff0c;代码示例如下&#xff1a; 假设有一个类&#xff1a;Animal.java public …

并发包原子类详解

原子类型是一种无锁的、线程安全的、使用基本数据类型和引用数据类型的线程安全解决方案。 CAS算法&#xff1a;CAS包含3个操作数&#xff0c;分别是内存值V、预期值A、要修改的新值B。当且仅当预期值A与内存值V相等时&#xff0c;将内存值V修改为B&#xff0c;否则什么都不需要…

ftp传海量文件会卡?跨境数据传输推荐使用FTP吗?

企业在传输大量文件时&#xff0c;经常会遇到FTP卡顿的问题&#xff0c;尽管采取多种方式仍无法完美解决&#xff0c;尤其是在跨境数据传输方面。对于紧急项目而言&#xff0c;文件数据无法及时同步可能导致任务无法按时完成。在传输速度方面&#xff0c;甚至可能出现每秒几KB的…

免费好用的API精选推荐

快递物流订阅与推送&#xff08;含物流轨迹&#xff09;&#xff1a;【物流订阅与推送、H5物流轨迹、单号识别】支持单号的订阅与推送&#xff0c;订阅国内物流信息&#xff0c;当信息有变化时&#xff0c;推送到您的回调地址。地图轨迹支持在地图中展示包裹运输轨迹。包括顺丰…

Jmeter入门

一、下载jmeter 官网下载 下载之后解压&#xff0c;在目录/bin下面找到jmeter.bat双击之后即可启动Jmeter。 二、使用 如下左图&#xff0c;选择语言为中文&#xff0c;可以修改测试计划的名称。如下右图&#xff0c;添加线程组 添加线程组 添加http请求 路径传参方式 …

Morphisec革命:利用移动目标防御增强Windows安全性

来源&#xff1a;艾特保IT 虹科分享 | Morphisec革命&#xff1a;利用移动目标防御增强Windows安全性 原文链接&#xff1a;虹科分享 | Morphisec革命&#xff1a;利用移动目标防御增强Windows安全性 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; Windows 10安全工…

esp32cam的与安卓的udp服务视频传输

esp32cam /* 下载程序 按住接口板上的IO0 在程序上传的时候 按一下 开发板上的rst按钮 待程序开始上传 在松开 IO0 brownout detector was triggered报错 触发了断电探测器&#xff0c;估计是供电环境本来就不稳定 屏蔽 #include "soc/soc.h" #include "so…

js中分号产生的问题详解,第一次出现分号导致的问题的记录

图示: 现在 这段代码本来是两行,但是格式化后注意下面一行缩进了,代表按一行解析了, 结果: 加上分号后再格式化就自动对齐了,代表按两行解析. 要是按照没有分号进行解析是怎样的? GPT回答: 这段代码是一行 JavaScript 代码&#xff0c;涉及到了 JSON 对象、条件语句和跳转页面…

python python输入位置的坐标(即经纬度),计算两点的距离结果保留两位

以下是Python代码实现&#xff1a; from math import radians, sin, cos, sqrtdef distance(lat1, lon1, lat2, lon2):R 6371 # 地球平均半径&#xff0c;单位为公里d_lat radians(lat2 - lat1)d_lon radians(lon2 - lon1)lat1 radians(lat1)lat2 radians(lat2)a sin(d…