最粗暴的方法实现一个栈

news2024/11/19 6:28:14

对于栈和队列是一个很简单的知识,用的感觉也不是很多,但是,我们仍然的学习!!加油!!在实现最简单的栈之前,我们需要简单了解一下栈是什么??

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、 入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 原文链接为: https://baike.baidu.com/item/%E6%A0%88/12808149?fr=aladdin

栈stack是以“先进后出”模式入栈,出栈的!比如:子弹的弹夹

对于数据12,23,34,45,56,我们进行入栈和出栈的简单描述为:

注意:如果我们想在上述的数据中,拿到12,则需要将12上面的全部数据都拿走,否则是拿不走12的!!先进后出模式!

另一种用法:如果你要存储的数据支持先进后出模式,则就需要用到栈stack这种数据结构!

下面我们就栈的几个基础的:入栈,压栈,得到栈顶元素(偷看),来进行讲解一下基础的语法!!

import java.util.Stack;

public class Tset {
    public static void main(String[] args) {
        Stack<Integer> stack =new Stack<>();
        //入栈
        stack.push(12);
        stack.push(23);
        stack.push(34);
        stack.push(45);
        System.out.println("获取此时栈中的元素个数:"+stack.size());

        //出栈
        System.out.println("出栈");
        Integer a=stack.pop();
        System.out.println(a);

        Integer b=stack.pop();
        System.out.println(b);
        System.out.println("获取此时栈中的元素个数:"+stack.size());


        //获取栈顶元素(偷看)
        System.out.println("获取栈顶元素(偷看)");
        Integer c=stack.peek();
        System.out.println(c);

        Integer d=stack.peek();
        System.out.println(d);
        System.out.println("获取此时栈中的元素个数:"+stack.size());

    }
}

上述代码的运行结果为:

对于该入栈时候的顺序为:12,23,34,45

经过上述的铺垫,那么,我们就深入研究一下;模拟实现一个栈吧!!以数组的形式实现一个栈!!

实现一个栈的准备阶段:必须定义一个栈:

public class MyStack {
    public int[] elem;
    public int usedSize;
    
    public MyStack(){
        //构造方法,定义数组的长度为10
        this.elem=new int[10];
    }  
}

有了上述的代码,那么我们就可以进行:压栈!!

压栈,(放入数据)
   //压栈(放入数据)
    public void push(int val){
        if (isFull()){
            //判断是否满了!
            //扩容
            elem= Arrays.copyOf(elem,2*elem.length);
        }
        elem[usedSize]=val;
        usedSize++;
    }
    
    public boolean isFull(){
        return usedSize== elem.length;
    }

首先先对需要放入到数据判断是否需要扩容处理!在上述的代码中,进行了2倍扩容!其实要想放入数据,这个代码很简单!!

出栈(获取栈顶元素)

    //出栈(将栈顶的元素出栈并返回)
    public int pop(){
        if(isEmpty()){
            throw new EmptyException("栈是空的!");
         //自定义异常
        }
        int val=elem[usedSize-1];
        usedSize--;
        return val;
    }
    
    public boolean isEmpty(){
        return usedSize==0;
    }

对于该段代码,实际上并没有删除元素,但是通过usedSize-1,或者通过usedSize--,不再记录该栈顶元素,所以可以理解为删除了

获取栈顶元素(偷看)
   //获取栈顶元素(偷看)
    public int peek(){
        if (isEmpty()){
            throw new EmptyException("栈是空的!");
        }
        return elem[usedSize-1];
    }

切记,在最后返回的时候,千万不能使用usedSize--,原因在于:peek是模仿的偷看!!如果使用usedSize--就会使得usedSize的数据发生改变!!

抛异常的代码:

public class EmptyException extends RuntimeException {
    public EmptyException() {
    }

    public EmptyException(String message) {
        super(message);
    }
}

抛异常的代码:也就简简单单的两个构造方法!!

测试用列:

public class Test {
    public static void main(String[] args){
        MyStack stack =new MyStack();
        //压栈(放入数据)
        stack.push(12);
        stack.push(23);
        stack.push(34);
        stack.push(45);

        //出栈
        Integer a=stack.pop();
        System.out.println(a);//45
        //此时栈中还有,12,23,34
        Integer b=stack.pop();
        System.out.println(b);
        //此时栈中还有,12,23
        System.out.println(stack.isEmpty());
    }
}

上述便是全部的代码!!到目前位置,我们遍实现了一个栈!!简单而又粗暴!!

注意区分:进栈过程可以出栈(边进边出)考试常见!!

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

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

相关文章

iplatform平台简介

前置条件&#xff1a;原则规范一&#xff09;统一技术栈1&#xff09;关于JDK统一使用Open JDK&#xff0c;版本最低1.8&#xff0c;几年后可能会升级到17&#xff1b;避免使用Sun JDK&#xff0c;这是商业软件&#xff0c;而且包含部分私有&#xff08;com.sun&#xff09;类库…

pandas 实战:分析三国志人物

简介 背景 Pandas 是 Python 的一个工具库&#xff0c;用于数据分析。由 AQR Capital Management 于 2008 年 4 月开发&#xff0c;2009 年开源&#xff0c;最初被作为金融数据分析工具而开发出来。Pandas 名称来源于 panel data&#xff08;面板数据&#xff09;和 Python d…

基于SEIR模型的传染病预测软件开发(完整代码+数据集+报告)

1 操作页面及用户使用说明(1) 界面说明App页面主要分为4个区域&#xff0c;分别是&#xff1a;曲线显示区、模型初始化和预防参数设定区、传染病特征参数设定区、绘图控制区。① 曲线显示区&#xff1a;显示模型预测的不同人数量随时间的变化曲线。② 模型初始化和预防参数设定…

泛函分析中的向量空间

一、向量空间背景 (1) 具有如下点内积或标量内积的实数域RRR上的欧式空间RNR^NRN&#xff1a; ⟨u,v⟩uTvu0v0u1v1⋯uN−1vN−1∑i0N−1uivi\langle\boldsymbol{u}, \boldsymbol{v}\rangle\boldsymbol{u}^{\mathrm{T}} \boldsymbol{v}u_{0} v_{0}u_{1} v_{1}\cdotsu_{N-1} v_{…

SpringCloud-Netflix学习笔记——微服务和微服务架构

一、什么是微服务&#xff1f; 什么是微服务&#xff1f;微服务&#xff08;Microservice Architecture&#xff09;是近几年流行的一种架构思想&#xff0c;关于它的概念很 难一言以蔽之。究竟什么是微服务呢&#xff1f;我们在此引用 ThoughtWorks 公司的首席科学家 Martin F…

谷粒商城-高级篇-Day11-商城业务

文章目录整合thymeleaf渲染页面页面修改不重启服务器实时更新渲染二三级数据nginx-搭建域名访问环境一nginx-搭建域名访问环境二整合thymeleaf渲染页面 将index放到product的资源下的static目录&#xff0c;index.html放到templates文件夹下 导入thymeleaf <!-- 模板引擎…

【Acwing寒假2023每日一题】4700. 何以包邮?- 01背包dp至少模板

4700. 何以包邮&#xff1f; - AcWing题库 设满x元包邮&#xff0c;题目要求总价值至少x的最小价值 目录 1、一维 01背包-至少模板 至少模板和至多模板的两大区别 2、二分 二维 01背包-至多模板 &#xff08;1&#xff09;二维dp 3、逆向思维 一维 01背包-至多模板 1…

1.环境搭建 创建spring boot 项目(mac)

1.安装maven 首先你需要在maven官网上下载mac专用的二进制maven压缩包。也就是下图的这个&#xff1a; 然后&#xff0c;开始我们的配置。 1、打开终端&#xff0c;输入这个代码&#xff1a; vim ~/.bash_profile 2、然后点击键盘上的“i”&#xff0c;进入vim编辑模式&…

【BBuf的CUDA笔记】五,解读 PyTorch index_add 操作涉及的优化技术

本文把pytorch index_add算子的代码抽取出来放在&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/indexing/index_add_cuda_pytorch_impl.cu 。如果不太熟悉PyTorch的话也可以直接看这个.cu文件&#xff0c;有问题请在这个repo提issue。 0x0.…

2022,我感受到了CSDN不平凡

最初注册CSDN&#xff0c;只是因为老师的要求&#xff0c;负责教C课程的老师让同学们注册CSDN&#xff0c;并经常更新自己的博客。虽然注册了CSDN的博客&#xff0c;也写了几篇博客文章&#xff0c;可最初我并不理解老师为什么要让我们注册&#xff0c;可是随着在CSDN驻留时间的…

运行时数据区

目录 一、概述 1.1、数据区 1.2、JAVA线程数据区 二、线程 2.1、JVM线程概述 2.2、JVM系统线程 三、PC寄存器 3.1、寄存器概述 3.2、作用 3.3、常见问题 一、概述 1.1、数据区 内存是非常重要的系统资源&#xff0c;是硬盘和CPU的中间仓库及桥梁&#xff0c;承载着操…

vulnhub DC系列 DC-5

总结&#xff1a; 下载地址 DC-5.zip (Size: 521 MB)Download: http://www.five86.com/downloads/DC-5.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-5.zip使用方法:解压后&#xff0c;使用vm直接打开ova文件。 漏洞利用 信息收集 这里还是使用DC-1的方法 1.给靶…

AR Foundation

AR Session 在一个AR应用中有且只允许存在一个AR Session 包括两个组件 &#xff1a;AR Session &#xff08;用于管理 Session&#xff09;、AR Input Manager (用于管理输入的一些信息) AR Session&#xff08;用于管理 Session&#xff09; 作用&#xff1a;管理AR应用状…

01.数据的存储

1. 数据类型介绍 1&#xff09;基本的内置类型&#xff1a;char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数 2&#xff09;类型的意义&#xff1a; 使用这个类型开辟内存空间的大小&#xff…

Docker快速入门自用笔记

1. Docker - 介绍 不同Linux的内核一致。 2. Docker - 与虚拟机的不同 3. Docker - Docker架构 镜像&#xff08;只读&#xff09;&#xff1a;应用程序及其所需依赖、函数库、环境、配置等文件打包在一起&#xff0c;称为镜像。 容器&#xff1a;镜像中的应用程序运行后…

一文看懂人机对话

人机对话概述 人机对话是指&#xff0c;让机器理解和运用自然语言实现人机通信的技术&#xff0c;如图1所示&#xff0c;通过人机对话交互&#xff0c;用户可以查询信息&#xff0c;如示例中的第一轮对话&#xff0c;用户查询天气信息&#xff0c;用户也可以和机器机型聊天&am…

Pytorch深度学习【十三】

LeNet网络 基本结构图 构造思路 先用卷积层来学习图片空间信息池化层降低敏感度全连接层来转换到类别空间 代码实现 import torch from torch import nn from d2l import torch as d2l class Reshape(nn.Module):def forward(self ,x):return x.view(-1, 1, 28, 28) # vie…

ElasticSearch7 Kibana集群安装

文章目录ElasticSearch安装下载安装包基础环境安装JDK安装修改Linux配置安装ES启动报错bootstrap check failure [1] of [1]: memory locking requested for elasticsearch process but memory is not lockedKibana安装Kibana简介Kibana下载Kibana安装ElasticSearch安装 下载安…

RS485接口电路设计

RS485接口是串口的一种&#xff0c;常常用在一些工业控制中&#xff0c;485通信是半双工的通信&#xff0c;一条总线最多可连接256个485设备。RS485信号速率最高可以到10Mbps&#xff0c;传输距离最大能到1000多米485接口包含一对差分信号A和B&#xff0c;如下图所示RS485标准规…

springcloud3 Nacos的集群搭建

一 nacos的集群搭建说明 1.1 版本选择的说明 本案例采用的版本是1.4.2 &#xff0c;当选用其他版本均有不同的问题&#xff1a; 1.4.4 nginx代理后&#xff0c;输入密码登录进去。 2.2.0 &#xff0c;2.1.2等 2.x版本均是 3个节点的启动之后&#xff0c;只能访问一个节点。…