【数据结构与算法】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.mzph.cn/news/652464.shtml

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

相关文章

Qt编写手机端视频播放器/推流工具/Onvif工具

一、视频播放器 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、…

《HTML 简易速速上手小册》第1章:HTML 入门(2024 最新版)

文章目录 1.1 HTML 简介与历史(😉🌐👽踏上神奇的网页编程之旅)1.1.1 从过去到现在的华丽蜕变1.1.2 市场需求 —— HTML的黄金时代1.1.3 企业中的实际应用 —— 不只是个网页1.1.4 职业前景 —— 未来属于你 1.2 基本 H…

第八篇【传奇开心果系列】beeware的toga开发移动应用示例:实现消消乐安卓手机小游戏

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、初步实现四、扩展思路五、实现游戏逻辑示例代码六、实现界面设计示例代码七、实现增加关卡和难度示例代码八、实现存档和排行榜示例代码九、实现添加特殊方块和道具示例…

C++提取ICO图标(PE文件资源提取)

最近需要写一个提取EXE或者DLL图标资源的功能, 网上找了很久, 要么功能不好用, 最后结果如下: 1.很多是加载为HICON句柄后转换为图片保存, 全损画质..., 2.后来找了个还能用的, 详见 https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/IconExtractor.cpp …

[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

网络会话管理

文章目录 一 什么是会话1 生活中会话2 Web中会话3 会话技术 二 Cookie1 原理2 使用2.1 添加cookie2.2 遍历cookie2.3 设置cookie的过期时间 3 特点 三 Session1 原理2 使用2.1 创建session对象2.2 不同的servlet间共享session对象中数据2.3 web.xml中设置session的超时时间 3 禁…

Keil软件某些汉字输出乱码,0xFD问题,51单片机

1. 问题 keil软件输入某些汉字的时候会输出乱码,例如:升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd,keil解析为0xc9数的GB2312编码为 0xcafd,keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …

E5071C 是德科技网络分析仪

181/2461/8938产品概述: E5071C ENA 矢量网络分析仪,9 kHz 至 20 GHz,配有增强型 TDR 测量选件。 E5071C 是大规模无源元器件测试的理想解决方案。 它具有出色的测量性能,有助于提高测试吞吐量,尤其是与 E5092A 多端…

力扣题目训练(3)

2024年1月27日力扣题目训练 2024年1月27日力扣题目训练290. 单词规律292. Nim 游戏303. 区域和检索 - 数组不可变91. 解码方法92. 反转链表 II41. 缺失的第一个正数 2024年1月27日力扣题目训练 2024年1月27日第三天编程训练,今天主要是进行一些题训练,包…

SQL注入:盲注

SQL注入系列文章: 初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 SQL注入:报错注入-CSDN博客 目录 什么是盲注? 布尔盲注 手工注入 使用python脚本 使用sqlmap 时间盲注 手工注入 使用python脚本 使…

聊聊鸿蒙HarmonyOS NEXT 的技术细节

上周,华为在深圳举办了“鸿蒙生态千帆启航仪式”,这也是华为鸿蒙开启生态进阶的信号。在政策的叠加下,鸿蒙未来必定是势不可挡的。我们这些程序员也得与时俱进,熟悉鸿蒙的技术和细节,别在经济寒冬里被淘汰了。 官方称…

scrapy框架核心知识Spider,Middleware,Item Pipeline,scrapy项目创建与启动,Scrapy-redis与分布式

scrapy项目创建与启动 创建项目 在你的工作目录下直接使用命令: scrapy startproject scrapytutorial运行后创建了一个名为scrapytutorial的爬虫工程 创建spider 在爬虫工程文件内,运行以下命令: scrapy genspider quotes创建了名为quotes的爬虫 …

【分治专题】详解快排类型4道题

本文讲解分治下的快排类型的4道题,在讲解题目的同时提供AC代码,点击题目即可打开对应链接 目录 1、颜色分类 2、排序数组 3、数组中的第K个最大元素 4、库存管理 III 1、颜色分类 解法(快排思想--三指针法使数组分三块)&…

专业建设数字平台

专业建设数字平台,遵循以学生发展为中心、以产出为导向的OBE理念,大数据赋能人才培养全过程管理,支撑专业数字化建设与专业认证等专项工作,平台围绕学院与专业建设中人才培养方案制定的顶层设计工作及全流程、全场景业务&#xff…

ARM常用汇编指令

文章目录 前言一、处理器内部数据传输指令MOV: 将数据从一个寄存器复制到另一个寄存器。MRS: 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR: 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…

力扣面试题 16.06. 最小差

Problem: 面试题 16.06. 最小差 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 注意本题目的数据范围!!! 1.对数组a与数组b进行排序;获取a与b的数组长度aLen,bLen,定义一个long类型的变量min; 2.分别让两个指针i,j指向数组的开…

56. 合并区间 - 力扣(LeetCode)

题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 题目示例 输入:intervals [[1,3…

LeNet跟LeNet5详解

1 LeNet结构 主要是为了手写数字识别 具体结构讲解:从图中例子可得 1 先传入一个灰度图像尺寸为1x28x28,通道数为1,尺寸为28x28的灰度图像 2 第一层5x5卷积,经过公式 输入图像尺寸-卷积核尺寸2padding/步长1,&#…

༺༽༾ཊ—设计-抽象-05-工厂-模式—ཏ༿༼༻

名称:抽象工厂 类型:创建型 目的:当有多个抽象角色时使用的一种工厂模式。 抽象工厂模式可以向客户端提供一个接口,使 客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。 优点&#xf…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader,uboot是一个遵循GPL协议的开源软件,uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…