【数据结构与算法】6.栈

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!


文章目录

  • 1. 栈
    • 1.1 栈的概念
    • 1.2 栈的使用
  • 2. 栈的模拟实现
    • 栈的定义
    • 入栈(push操作)
    • 出栈(pop操作)
    • 查看栈顶元素(peek操作)
    • 判断栈是否为空
  • 3. 完整代码

1. 栈

1.1 栈的概念

:一种特殊的线性表,其**只允许在固定的一端进行插入和删除元素操作(表的末端)。**进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

对栈的基本操作有push(入栈)和pop(出栈),前者相当于插入,后者则时删除最后插入的元素。

栈又称为 LIFO(后进先出)表。

image-20240120155359716

栈在生活中的例子:

图片1

1.2 栈的使用

方法功能
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素的个数
boolean empty()检测栈是否为空

2. 栈的模拟实现

栈的定义

  1. 定义一个数组,用于存储栈的元素

    public int[] elem; 
    
  2. 定义一个变量,用于记录栈的有效元素个数

    public int usedSize; 
    
  3. 定义一个常量NUMBER,其值为10,表示栈的默认大小

    public static final int NUMBER = 10;
    
  4. 构造方法,初始化栈

    public MyStack() {  this.elem = new int[NUMBER];  
    }  
    

栈的定义完整代码:

public class MyStack {public int[] elem; // 定义一个数组public int usedSize; // 记录数组中数据有效的个数public static final int NUMBER = 10; // 默认数组长度为10public MyStack() {this.elem = new int[NUMBER];}
}

入栈(push操作)

  1. 定义方法判断栈是否已满(即是否还有入栈空间):如果usedSize等于数组长度,则表示栈已满,返回true;否则返回false

    public boolean isFull() {return usedSize == elem.length;
    }
    
  2. 判断栈是否已满(usedSize等于数组长度),则需要扩展数组的大小),使用Arrays.copyOf方法将原数组复制一份,长度为原数组的两倍

    public void push(int val) {if (isFull()) {this.elem = Arrays.copyOf(elem,2 * elem.length);}
    }
    
  3. val存入数组的usedSize位置,并将usedSize加1,表示有一个新元素入栈

elem[usedSize] = val;
usedSize++;

入栈完整代码:

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

出栈(pop操作)

  1. 判断栈是否为空,如果为空则抛出异常

    if (isEmpty()) {throw new EmptyStackException("栈空");
    }
    

    EmptyStackException异常类:

    public class EmptyStackException extends RuntimeException{public EmptyStackException() {}public EmptyStackException(String message) {super(message);}
    }
    
  2. 不为空则usedSize - 1,表示有一个元素出栈

    usedSize--;
    
  3. 返回usedSize位置的元素值(即栈顶元素)

     return elem[usedSize];
    

出栈完整代码:

public int pop() {if (isEmpty()) {throw new EmptyStackException("栈空");}usedSize--;return elem[usedSize];
}

查看栈顶元素(peek操作)

  1. 判断栈是否为空,如果为空则抛出异常

    if (isEmpty()) {throw new EmptyStackException("栈空");
    }
    
  2. 返回uesedSize - 1位置的元素值(即栈顶元素)

    return elem[usedSize - 1];
    

判断栈是否为空

如果usedSize等于0,则表示栈为空,返回true;否则返回false

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

3. 完整代码

MyStack类:

import java.util.Arrays;public class MyStack {public int[] elem; // 定义一个数组public int usedSize; // 记录数组中数据有效的个数public static final int NUMBER = 10; // 默认数组长度为10public MyStack() {this.elem = new int[NUMBER];}// 入栈public void push(int val) {if (isFull()) {this.elem = Arrays.copyOf(elem,2 * elem.length);}elem[usedSize] = val;usedSize++;}// 判断数组是否存满数据public boolean isFull() {return usedSize == elem.length;}// 出栈public int pop() {if (isEmpty()) {throw new EmptyStackException("栈空");}usedSize--;return elem[usedSize];}// 判断数组是否为空public boolean isEmpty() {return usedSize == 0;}public int peek() {if (isEmpty()) {throw new EmptyStackException("栈空");}return elem[usedSize - 1];}
}

EmptyStackException类:

public class EmptyStackException extends RuntimeException{public EmptyStackException() {}public EmptyStackException(String message) {super(message);}
}

在这里插入图片描述

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

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

相关文章

Android App开发基础(1)—— App的开发特点

本文介绍基于Android系统的App开发常识,包括以下几个方面:App开发与其他软件开发有什么不一样,App工程是怎样的组织结构又是怎样配置的,App开发的前后端分离设计是如何运作实现的,App的活动页面是如何创建又是如何跳转…

HarmonyOS 鸿蒙应用开发 (七、HTTP网络组件 axios 介绍及封装使用)

在HarmonyOS应用开发中,通过HTTP访问网络,可以使用官方提供的ohos.net.http模块。但是官方提供的直接使用不太好使用,需要封装下才好。推荐使用前端开发中流行的axios网络客户端库,如果是前端开发者,用 axios也会更加顺…

springboot项目开发,使用thymeleaf前端框架的简单案例

springboot项目开发,使用thymeleaf前端框架的简单案例!我们看一下,如何在springboot项目里面简单的构建一个thymeleaf的前端页面。来完成动态数据的渲染效果。 第一步,我们在上一小节,已经提前预下载了对应的组件了。 如图&#x…

C++20 高级编程

文章目录 前言前奏lambda浅谈std::ref的实现浅谈is_same浅谈std::function的实现std::visit 与 std::variant 与运行时多态SFINAE类型内省标签分发 (tag dispatching)软件设计六大原则 SOLID To be continue.... 前言 C20 是C在C11 之后最大的一次语言变革, 其中引入了大量具有…

MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作

文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB参考文献 1. 容器与应用之间的关系介绍 MongoDB 的安装有时候并不是那么容易的&#xff0…

OSI七层模型 | TCP/IP模型 | 网络和操作系统的联系 | 网络通信的宏观流程

文章目录 1.OSI七层模型2.TCP/IP五层(或四层)模型3.网络通信的宏观流程3.1.同网段通信3.2.跨网段通信 1.OSI七层模型 在计算机通信诞生之初,不同的厂商都生产自己的设备,都有自己的网络通讯标准,导致了不同厂家之间各种协议不兼容&#xff0…

数论Leetcode204. 计数质数、Leetcode858. 镜面反射、Leetcode952. 按公因数计算最大组件大小

Leetcode204. 计数质数 题目 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 代码 class Solution:def countPrimes(self, n: int) -> int:if n < 2:return 0prime_arr [1 for _ in range(n)]prime_arr[0], prime_arr[1] 0, 0ls list()for i in…

JVM基础知识汇总篇

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-菜单管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

网络原理-初识(1)

目录 网络发展史 独立模式 网络互连 局域网LAN 广域网WAN 网络通信基础 IP地址 概念 格式 端口 概念 格式 认识协议 概念 作用 五元组 网络发展史 独立模式 独立模式:计算机之间相互独立; 网络互连 随着时代的发展,越来越需要计算机之间相互通信,共享软件和数…

Springboot的 Lombok全部关联注解以及核心注解@Data详解

目录 工具安装 依赖注入 注解类别 1. Getter / Setter 2. ToString 3. EqualsAndHashCode 4. NoArgsConstructor / RequiredArgsConstructor / AllArgsConstructor 5. Data 示例 注意事项 6. Value 7. Builder 8. Slf4j / Log / Log4j / Log4j2 / XSlf4j 9. NonN…

幻兽帕鲁服务器数据备份

搭建幻兽帕鲁个人服务器&#xff0c;最近不少用户碰到内存不足、游戏坏档之类的问题。做好定时备份&#xff0c;才能轻松快速恢复游戏进度 这里讲一下如何定时将服务器数据备份到腾讯云轻量对象存储服务&#xff0c;以及如何在有需要的时候进行数据恢复。服务器中间的数据迁移…

CSS 楼梯弹弹球

<template><view class="loader"></view> </template><script></script><style>body {background-color: #212121;/* 设置背景颜色为 #212121 */}.loader {position: relative;/* 设置定位为相对定位 */width: 120px;/* 设…

java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数

java正则校验&#xff0c;手机号&#xff0c;邮箱&#xff0c;日期格式&#xff0c;时间格式&#xff0c;数字金额两位小数 3.58是否为金额&#xff1a;true 3.582是否为金额&#xff1a;false 1284789qq.com是否为email&#xff1a;true 1284789qq.com是否为email&#xff1…

【c语言】详解操作符(下)

前言&#xff1a; 在上文中&#xff0c;我们已经学习了 原码、反码、补码、移位 操作符、移位操作符、位操作符、逗号表达式、下标访问[ ]、函数调用&#xff08; &#xff09;&#xff0c;接下来我们将继续学习剩下的操作符。 1. 结构成员访问操作符 1.1 结构体成员的直接访…

计算机网络-ensp模拟器安装简介

一、概述 eNSP(Enterprise Network Simulation Platform)是一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台&#xff0c;主要对企业网路由器、交换机进行软件仿真&#xff0c;完美呈现真实设备实景&#xff0c;支持大型网络模拟。 简单来讲就是一个网络设备模…

前端大厂面试题探索编辑部——第二期

目录 题目 单选题1 题解 关于TCP 关于UDP 单选题2 题解 A选项的HTTP是否是无状态协议 B选项的HTTP支持的方法 C选项的关于HTTP的状态码 D选项HTTP协议的传输格式 题目 单选题1 1.以下哪个描述是关于 TCP 和 UDP 的区别&#xff08;&#xff09; A. TCP 是无连接的…

apipost和curl收不到服务器响应的HTTP/1.1 404 Not Found

windows的apipost发送请求后&#xff0c;服务器响应了HTTP/1.1 404 Not Found&#xff0c;但是apipost一直显示发送中。 linux上的curl也一样。 使用wireshark抓包发现收到了响应&#xff0c;但是wireshark识别不了&#xff08;图中是回应404后关闭了连接&#xff09;&#xff…

RBD —— Fracture SOP

目录 Assemble —— 清理破碎操作并生成碎片 Boolean Fracture —— 使用切割面破碎输入的几何体 Convex Decomposition —— 将输入几何体分解为凸线段 Glue Cluster —— 构建cluster值想glue约束添加强度 RBD Material Fracture —— 基于材质类型预破碎 Concrete Gl…

滑动窗口算法

长度最小的子数组(mid&#xff09; 题目链接&#xff1a;长度最小的子数组 算法思路 解法1&#xff1a;暴力枚举&#xff08;超时&#xff09;「从前往后」枚举数组中的任意⼀个元素&#xff0c;把它当成起始位置。然后从这个「起始位置开始&#xff0c;然后寻找⼀段最短的区间…