数据结构:栈(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.rhkb.cn/news/215502.html

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

相关文章

【算法题】数字字符串组合倒序 (js)

解法&#xff1a; const str "I am an 20-years out--standing * -stu- dent";function solution(str) {const arr str.split(" ");const newArr arr.map((str) > {if (/[a-zA-Z0-9-]/.test(str)) {if (/-{2}/g.test(str)) {return str.replace(/-…

Tair(2):Tair安装部署

1 安装相关依赖库 yum install -y gcc gcc-c make m4 libtool boost-devel zlib-devel openssl-devel libcurl-devel yum&#xff1a;是yellowdog updater modified 的缩写&#xff0c;Linux中的包管理工具gcc&#xff1a;一开始称为GNU C Compiler&#xff0c;也就是一个C编…

持续集成交付CICD:使用Maven命令上传Nexus制品

目录 一、实验 1.使用Maven命令上传Nexus制品&#xff08;第一种方式&#xff09; 2.使用Maven命令上传Nexus制品&#xff08;第二种方式&#xff09; 一、实验 1.使用Maven命令上传Nexus制品&#xff08;第一种方式&#xff09; &#xff08;1&#xff09;指定一个 hoste…

11--常用类和基础API--01

1、API概述 1.1 什么是API API(Application Programming Interface)&#xff0c;应用程序编程接口。 Java API是一本程序员的字典 &#xff0c;是JDK中提供给我们使用的类的说明文档。这些类将底层的代码实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#x…

屏幕分辨率修改工具SwitchResX mac功能特点

SwitchResX mac是可用于修改和管理显示器的分辨率和刷新率。 SwitchResX mac功能和特点 支持多种分辨率和刷新率&#xff1a;SwitchResX可以添加和管理多种分辨率和刷新率&#xff0c;包括自定义分辨率和刷新率。 自动切换分辨率&#xff1a;SwitchResX可以根据应用程序和窗口…

Tomcat从认识安装到详细使用

文章目录 一.什么是Tomact?二.Tomcat的安装1.下载安装包2.一键下载3.打开Tomcat进行测试4.解决Tomcat中文服务器乱码 三.Tomcat基本使用1.启动与关闭Tomcat2.Tomcat部署项目与浏览器访问项目 四.Tomcat操作中的常见问题1.启动Tomcat后&#xff0c;启动窗口一闪而过&#xff1f…

微信小程序-uniapp 仿豆瓣评分 (附源码)

微信小程序由于适用性强、逻辑简要、开发迅速的特性&#xff0c;叠加具有海量活跃用户的腾讯公司背景&#xff0c;逐渐成为了轻量级单一功能应用场景的较佳承载方式&#xff0c;诸如电影购票、外卖点餐、移动商城、生活服务等场景服务提供商迅速切入了。 效果图 主页 更多页…

jsp 动物疾病诊断管理系Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 动物疾病诊断管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

千梦网创:肚子基础决定脑子建筑

我每个星期都要跟魔鬼实战训练营的铁铁们唠嗑。 他们中&#xff0c;混得好的都喜欢找我聊天&#xff0c;可能比较有成就感吧。 不知道为什么没怎么做出成绩的学员很少找我聊天&#xff0c;要是你偷摸着发财也就算了&#xff0c;如果你真的没做出来什么我觉得你更要来找我聊天…

物联网后端个人第十四周总结

物联网方面进度 1.登陆超时是因为后端运行的端口和前端监听的接口不一样&#xff0c;所以后端也没有报错&#xff0c;将二者修改一致即可 2.登录之后会进行平台的初始化&#xff0c;但是初始化的时候会卡住,此时只需要将路径的IP端口后边的内容去掉即可 3.阅读并完成了jetlinks…

[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........

文章目录 一、完整代码二、论文解读2.1 介绍2.2 架构2.3 输入端2.4 结果 三、过程实现四、整体总结 论文&#xff1a;Unified Language Model Pre-training for Natural Language Understanding and Generation 作者&#xff1a;Li Dong, Nan Yang, Wenhui Wang, Furu Wei, Xia…

OpenCV-Python:DevCloud CodeLab介绍及学习

1.Opencv-Python演示环境 windows10 X64 企业版系统python 3.6.5 X64OpenCV-Python 3.4.2.16本地PyCharm IDE线上注册intel账号&#xff0c;使用DevCloud CodeLab 平台 2.DevCloud CodeLab是什么&#xff1f; DevCloud是一个基于云端的开发平台&#xff0c;提供了强大的计算…

ArcGIS Pro中怎么设置标注换行

在ArcGIS Pro中进行文字标注的时候&#xff0c;如果标注的字段内容太长&#xff0c;直接标注的话会不美观&#xff0c;而且还会影响旁边的标注显示&#xff0c;这里为大家介绍一下在ArcGIS Pro中设置文字换行的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的…

数据结构之----逻辑结构、物理结构

数据结构之----逻辑结构、物理结构 目前我们常见的数据结构分别有&#xff1a; 数组、链表、栈、队列、哈希表、树、堆、图 而它们可以从 逻辑结构和物理结构两个维度进行分类。 什么是逻辑结构&#xff1f; 逻辑结构是指数据元素之间的逻辑关系&#xff0c;而逻辑结构又分为…

使用torch解决线性回归问题

数据处理 import torch import numpy as np import pandas as pd import matplotlib.pyplot as pltdatapd.read_csv(./datasets/Income1.csv) #数据准备data.head(5)#展示数据 #以上所有的代码都是用jupyter notebook写&#xff0c;形成了阶段性的结果展示 查看数据信息 dat…

SSM整合——Springboot

1.0 概述 1.1 持久层&#xff1a; DAO层&#xff08;mapper&#xff09; DAO层&#xff1a;DAO层主要是做数据持久层的工作&#xff0c;负责与数据库进行联络的一些任务都封装在此 DAO层的设计首先是设计DAO的接口&#xff0c; 然后在spring-mapper.xml的配置文件中定义此接…

混合预编码(Hybrid Precoding)的全连接结构与子连接结构

A Survey on Hybrid Beamforming Techniques in 5G: Architecture and System Model Perspectives 全连接结构的混合预编码 子连接结构的混合预编码 Alternating Minimization Algorithms for HybridPrecoding in Millimeter Wave MIMO Systems

深度学习——第4.3章 深度学习的数学基础

第4章 深度学习的数学基础 目录 4.7 指数函数和对数函数 4.7 指数函数和对数函数 深度学习经常会用到Sigmoid函数和Softmax函数&#xff0c;这些函数是通过包含exp(x)的指数函数创建的。后面我们需要求解这些函数的导数。 4.7.1 指数 指数是一个基于“乘以某个数多少次”&a…

关于个人职业选择

职业选择&#xff0c;一直是个老生常谈的话题。这并不是一个容易做的决定。 让我们来看看AI怎么说。 首先是方向性的回答&#xff1a; 然后是一些具体的回答 我个人比较倾向于深耕网络安全。这是一个很有趣也是一个持续发展着的领域。 不知道关于这个事情你怎么看&#xff0…

创建vue项目:vue脚手架安装、vue-cli安装,vue ui界面创建vue工程(vue2/vue3),安装vue、搭建vue项目开发环境(保姆级教程二)

今天讲解 Windows 如何利用脚手架创建 vue 工程&#xff0c;以及 vue ui 图形化界面搭建 vue 开发环境&#xff0c;这是这个系列的第二章&#xff0c;有什么问题请留言&#xff0c;请点赞收藏&#xff01;&#xff01;&#xff01; 文章目录 1、安装vue-cli脚手架2、vue ui创建…