栈的介绍以及使用数组模拟栈的入栈和出栈

news2024/11/23 14:57:22

❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️

🧑个人主页:@周小末天天开心

各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力

感谢!

📕该篇文章收录专栏—数据结构

目录

栈(stack)

介绍

应用场景

使用数组模拟栈

思路分析

编写ArrayStack类,表示一个栈

属性

入栈

 出栈

 显示栈

编写ArrayStackDemo类,演示数组模拟栈


栈(stack)

介绍

(1)栈是一个先进后出的有序列表

(2)栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。

(3)根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素时正好相反,最后放入的元素最先删除,最先放入的元素最后删除。

应用场景

(1)子程序的调用:在跳往子程序之前,会先将下一个指令的地址存到栈中,直到子程序执行完毕后再将地址取出,回到原来的程序当中。

(2)处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入到栈中。

(3)表达式的转换[中缀表达式转后缀表达式]与求职(实际解决)。

(4)二叉树的遍历。

(5)图形的深度优化搜索法。


使用数组模拟栈

思路分析

(1)定义一个 top 表示栈顶,初始化为 -1

(2)入栈的操作:stack[++top] = data;

(3)出栈的操作:int value = stack[top--]; return value;

编写ArrayStack类,表示一个栈

属性

class ArrayStack {
    private int maxSize;//栈的大小
    private int[] stack;//用数组模拟栈,将数据放到数组中
    private int top = -1;//表示栈顶,默认值为 -1

    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[maxSize];
    }

    //栈满
    public boolean isFull() {
        return top == maxSize - 1;
    }
    //栈空
    public boolean isEmpty() {
        return top == -1;
    }
}

入栈

//入栈-push
    public void push(int value) {
        //先判断栈是否为满
        if(isFull()) {
            System.out.println("栈满");
            return;
        }
        stack[++top] = value;
    }

 出栈

//出栈-pop,将栈顶的数据返回
    public int pop() {
        //先判断栈是否为空
        if(isEmpty()) {
//            System.out.println("栈空");
//            return;
        // 因为有返回值,所以不能用这种返回的方式
        throw new RuntimeException("栈空");
        }
        int value = stack[top--];
        return value;
    }

 显示栈

//显示栈的情况(遍历栈),遍历时,需要从栈顶开始显示数据
    public void list() {
        //判断栈是否为空
        if(isEmpty()) {
            System.out.println("栈空");
            return;
        }
        //从栈顶开始显示数据
        for (int i = top; i >= 0; i--) {
            System.out.printf("stack[%d] = %d\n",i,stack[i]);
        }
    }

编写ArrayStackDemo类,演示数组模拟栈

import java.util.Scanner;
//用数组表示栈
public class ArrayStackDemo {
    public static void main(String[] args) {
        ArrayStack arrayStack = new ArrayStack(5);
        boolean loop = true;//控制是否退出菜单
        Scanner scanner = new Scanner(System.in);

        while(loop) {
            System.out.println("push:入栈");
            System.out.println("pop:出栈");
            System.out.println("show:显示栈");
            System.out.println("exit:退出程序");

            System.out.println("请输入你的选择:");
            String key = scanner.next();

            switch (key) {
                case "push":
                    System.out.println("请输入一个数:");
                    int value = scanner.nextInt();
                    arrayStack.push(value);
                    break;
                case "pop":
                    try {
                        int res = arrayStack.pop();//抛出异常
                        System.out.println("出栈的数据为:" + res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "show":
                    arrayStack.list();
                    break;
                case "exit":
                    scanner.close();//关闭scanner
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序以及结束");
    }
}

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

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

相关文章

[U3D ShaderGraph] 全面学习ShaderGraph节点 | 第三课 | Input/Gradient

📣📣📣本专栏所有内容在完结之前全部为试读模式,专栏完结之后会取消试读模式,如果感觉内容还不错的话请支持一下📣📣📣 ShaderGraph是可视化的着色器编辑工具。您可以使用此工具以可视方式创建着色器。 本专栏可以让你更了解ShaderGraph中每个节点的功能,更自如的…

eBPF汇编指令你还不知道?看这一篇文就够了

【好文推荐】 一文看懂linux 内核网络中 RPS/RFS 原理 怎么在Windows下使用Makefile文件 浅析linux内核网络协议栈--linux bridge 大家好,我是你们的彦祖,今天这篇文主要介绍 eBPF 的指令系统,对于想深入理解 eBPF 的同学千万不要错过&#x…

实验五 计数/定时器的设计【Verilog】

实验五 计数/定时器的设计【Verilog】前言推荐实验五 计数/定时器的设计一、实验目的二、实验环境三、实验任务四、实验原理与实验步骤五、实验思考最后前言 以下内容源自Verilog实验 仅供学习交流使用 推荐 Verilog 实验五 计数/定时器的设计 一、实验目的 掌握二进制计…

计时器Timing Wheel 时间轮算法

文章目录1. 前言2. 什么是时间轮算法?2.1 单层时间轮2.2 多层时间轮2.2.1 增加轮次的概念2.2.2 多层次时间轮2.3 小结3. 实现案例3.1 Kafka中的时间轮3.1.1 任务的添加3.1.2 时间轮的推进SystemTimer3.1.3 小结1. 前言 计时器对于故障恢复、基于速率的流量控制、调…

[yolov5] yolo的数据标签格式

yolov5 的标签格式 参考链接: https://github.com/ultralytics/yolov5/issues/9816 翻译内容 你好!。感谢您询问YOLOv5🚀数据集格式。用于分割的XY坐标与用于长方体中心的标准坐标相同。 为了正确训练,您的数据必须为YOLOv5格式。有关数…

数据结构与算法的基本概念

前言 技术学得再多,再好还不如将基础学扎实。欠下的迟早是要还的。与其在以后后悔当初不好好学,还不如在大学期间将该学的知识学透。《数据结构与算法》确实不好学,但大学四年下来,还怕啃不下一本书??正是基…

自动驾驶技术

高精地图(HD Maps):支持其他模块 定位(Localization):讨论汽车如何确定他所处的位置,汽车利用激光和雷达数据,将这些传感器感知内容与高分辨地图进行对比,这种对比使得汽…

Scanpy plot umap的color编码, Scanpy 的color map 如何设置?

Scanpy plot umap的color编码, Scanpy 的color map 如何设置?关键词palette(调色板) https://scanpy.readthedocs.io/en/stable/generated/scanpy.pl.umap.html?highlightpl.umap#scanpy.pl.umap https://scanpy.discourse.grou…

JavaScript -- 08. 数组介绍

文章目录数组1 数组简介1.1 创数组1.2 向数组添加元素1.3 读取数组中的元素1.4 获取数组长度2 数组的遍历2.1 使用for循环遍历2.2 for-of遍历3 数组的方法3.1 Array.isArray()3.2 at()3.3 concat()3.4 indexOf()3.5 lastIndexOf()3.6 join()3.7 slice()3.8 push()3.9 pop()3.10…

Android Jetpack-Compose相关

Android Jetpack-Compose相关 一、什么是Compose? Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发,打造生动而精彩的应用。它可让您更快…

Go学习之路-环境搭建

默认运行设备系统:MacOS 安装 安装包下载地址(下面3个都可以): https://studygolang.com/dl https://golang.google.cn/dl/ https://golang.org/dl/ 我这里选择 pkg包、一键安装、默认的安装路径 /usr/local/go 环境 设置go语言…

[附源码]计算机毕业设计springboot在线图书销售系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

mmap 创建共享内存映射

所谓内存映射指的是 让一个磁盘文件与内存中的一个缓冲区相映射,进程访问这块内存时,就等同于访问文件对应映射部分,不必再调用 read / write 。 我们可以使用mmap函数来建立内存和文件某一部分的映射关系。 目录 一、共享内存映射的创建 /…

代码审计-3 文件包含漏洞

文章目录代码审计-文件包含漏洞文件包含漏洞种类当检测到目标存在文件包含漏洞时可以怎么利用文件包含中php可使用的协议PHPCMS V9.6.3后台文件包含漏洞后台路由分析漏洞寻找代码审计-文件包含漏洞 文件包含漏洞种类 当检测到目标存在文件包含漏洞时可以怎么利用 文件包含中php…

npm run dev和npm run serve

npm run dev和npm run serve目录概述需求:设计思路实现思路分析1.npm install命令2.package.json3.npm run serve参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make …

redis基础4——RDB持久化、AOF持久化全面深入解读

文章目录一、redis持久化机制1.1 持久化的背景1.2 两种持久化概念1.2.1 快照方式(RDB)1.2.2 文件追加方式(AOF)1.3 rdb持久化(Redis Database)1.3.1 快照原理1.3.2 触发机制1.3.2.1 手动触发1.3.2.1.1 save…

最常用的python开发工具

有哪些值得推荐的 Python 开发工具 推荐5个非常适合Python小白的开发工具:1、Python TutorPython Tutor是由Philip Guo开发的一个免费教育工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。 通过…

CentOS8克隆虚拟机修改IP,错误:未知的连接 “ens160“

关于CentOS8该如何克隆与修改IP,并设置成静态IP的方法,可以参考我的另一篇文章,我也是一直这么做的。 CentOS8拷贝虚拟机、修改ip、主机 但是最近我再使用我的这篇文章克隆虚拟机的时候,竟然报错了,本来想删除掉克隆…

2023年天津农学院专升本专业课报名、确认缴费及准考证打印流程

天津农学院2023年高职升本科专业课考试 报名、确认缴费及准考证打印操作流程 一、报名操作流程 1. 阅读报名注意事项 请考生于2022年12月5日9点—12月10日12点登录报名系统 http://gzsb.tjau.edu.cn,请认真阅读报名注意事项。2.报名登录 点击“报名”菜单后进入报名…

LeetCode 374. 猜数字大小

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 374. 猜数字大小,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode 374.…