栈(Stack)的概念+MyStack的实现+栈的应用

文章目录

  • 栈(Stack)
    • 一、 栈的概念
      • 1.栈的方法
      • 2.源码分析
    • 二、MyStack的实现
      • 1.MyStack的成员变量
      • 2.push方法
      • 3.isEmpty方法和pop方法
      • 4.peek方法
    • 三、栈的应用
      • 1.将递归转化为循环
        • 1.调用递归打印
        • 2.通过栈逆序打印链表


栈(Stack)


一、 栈的概念

  • 栈:先进后出,后进先出
  • 在这里插入图片描述

1.栈的方法

  • push 压栈,栈的插入操作,插入栈顶
  • pop 出栈,栈的删除操作,从栈顶删除
  • peek 查看栈顶的元素,不进行改变
  • size 查看栈的大小
  • isEmpty 判断栈是否为空
 public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);//压栈,存进数据
        stack.push(2);
        stack.push(3);
        Integer pop = stack.pop();//出站
        System.out.println(pop);//取出3
        Integer peek = stack.peek();//查看栈顶的元素
        System.out.println(peek);//2
        Integer peek1 = stack.peek();
        System.out.println(peek);
        System.out.println(stack.size());//2
        boolean empty = stack.isEmpty();
        System.out.println(empty);//false
    }

2.源码分析

在这里插入图片描述

虽然栈自身的方法少,但是继承了Vector,可以调用Vector里面的方法
Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的

在这里插入图片描述

栈的底层由数组组成,因为栈继承自Vector,Vector的底层是一个数组
所以也叫顺序栈

二、MyStack的实现

1.MyStack的成员变量

public class MyStack {
    public int[] elem;
    public int userSize;

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

定义存储数据的elem数组
定义数组的使用大小
通过构造器,创建数组的大小

2.push方法

    public void push(int val) {//压栈
        if (isFull()) {//判断是否满了
            elem = Arrays.copyOf(elem, elem.length * 2);//扩容
        }
        elem[userSize++] = val;//后置++,
    }

    public boolean isFull() {
        return userSize == elem.length;
    }

1.要插入元素,先通过isFull方法判断数组是否满了
2.如果满了进行2倍的扩容
3.val值存进userSize索引的数组内
4.userSize++是后置的++,在存入到elem[userSize]位置后,userSize加一

3.isEmpty方法和pop方法

 public int pop() {//出栈
        if (isEmpty()){
           throw new EmptyException("栈是空的");
        }
       /* int val = elem[userSize-1];
        userSize--;
        return val;*/
     /*   userSize--;
        return elem[userSize];*/
        return elem[--userSize];//前置-- 先--再返回下标的值
    }

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

1.先写isEmpty方法,如果userSize等于0,证明栈为空
2.在pop方法,调用isEmpty方法,如果为空,抛出异常
3.返回userSize减1后,数组中下标的值(注意前置–)

4.peek方法

    public int peek(){
        if (isEmpty()){
            throw new EmptyException("栈是空的");
        }
        return elem[userSize-1];
    }

先判断是否为空,不为空,返回userSize-1处数组的值

三、栈的应用

1.将递归转化为循环

逆序打印链表

1.调用递归打印
  public void disPlay2(ListNode pHead) {
        if (pHead == null) {
            return;
        }
        if (pHead.next==null){
            System.out.print(pHead.val+" ");
            return;
        }
        disPlay2(pHead.next);
        System.out.println(pHead.val+" ");
    }

直到头结点的下一个结点为空时,打印头结点的值,否则移动头结点,再次执行
将最后的结点打印完后,返回到上一步打印,依次完成逆序打印

2.通过栈逆序打印链表
 public void disPlay3(){
        Stack<ListNode> stack = new Stack<>();
        ListNode cur = head;
        while (cur!=null){//遍历链表,压栈
            stack.push(cur);
            cur = cur.next;
        }
        //遍历栈
        while (!stack.isEmpty()){
            ListNode pop = stack.pop();
            System.out.println(pop.val);//依次出栈打印取出的pop的值
        }
        System.out.println();
    }

1.先遍历链表,依次压栈
2.遍历栈,当栈不为空的时候,依次取出栈,打印取出结点的val值
3.完成逆序打印

点击移步博客主页,欢迎光临~

偷cyk的图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx动静分离

为了加快网站的解析速度&#xff0c;可以把动态页面和静态页面由不同的服务器来解析&#xff0c;加快解析速度。降低原来单个服务器的压力。 在动静分离的tomcat的时候比较明显&#xff0c;因为tomcat解析静态很慢&#xff0c;其实这些原理的话都很好理解&#xff0c;简单来说&…

T113-S3-buildroot文件系统tar解压缩gz文件

目录 前言 一、现象描述 二、解决方案 三、tar解压缩.gz文件 总结 前言 本文主要介绍全志T113-S3平台官方SDK&#xff0c;buildroot文件系统tar不支持.gz文件解压缩的问题以及如何配置buildroot文件系统解决该问题的方法介绍。 一、现象描述 在buildroot文件系统中&#xff…

Doceker-compose——容器群集编排管理工具

目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1&#xff09;使用 YAML 时需要注意下面事项 2&#xff09;ymal文件格式 3&#xff09;json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compos…

强劲升级,太极2.x你值得拥有!

嗨&#xff0c;大家好&#xff0c;最近桃桃没顾得上给大家分享好用好玩的软件。 还记得前段时间给大家分享的太极1.0软件&#xff1f; 最近大佬对软件进行了全新升级&#xff0c;升级后的功能更强更稳定&#xff0c;轻度用户使用基本功能就已经足够了&#xff0c;壕无人性的同学…

Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

Ubuntu 安装 npm 和 node

前言 最近学习VUE&#xff0c;在ubuntu 2204 上配置开发环境&#xff0c;涉及到npm node nodejs vue-Cli脚手架等内容&#xff0c;做以记录。 一、node nodejs npm nvm 区别 &#xff1f; node 是框架&#xff0c;类似python的解释器。nodejs 是编程语言&#xff0c;是js语言的…

题目 1053: 二级C语言-平均值计算(python详解)——练气三层初期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

外网nat+nat server,内网做路由过滤,以及ppp CHAR认证 企业网搭建

作业 网络拓扑图如下所示&#xff1a; 要求&#xff1a;做适当的截图&#xff0c;表示完成相应的操作。 按照网络拓扑要求搭建网络结构&#xff0c;按照个人学号配置每个节点的IP地址&#xff0c;其中X为班级号&#xff0c;Y为学号末尾2位&#xff1b;Y1为学号末尾2位1&#…

uniapp接入萤石微信小程序插件

萤石官方提供了一些适用于uniapp / 小程序的方案 如 小程序半屏 hls rtmp 等 都TM有坑 文档写的依托答辩 本文参考了uniapp小程序插件 以及 萤石微信小程序插件接入文档 效果如下 1. 插件申请 登录您的小程序微信公众平台&#xff0c;点击左侧菜单栏&#xff0c;进入设置页…

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】

准备工作&#xff1a;CentOS 7系统&#xff0c;并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意&#xff1a;这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…

OpenCV中world模块介绍

OpenCV中有很多模块&#xff0c;模块间保持最小的依赖关系&#xff0c;用户可以根据自己的实际需要链接相关的库&#xff0c;而不需链接所有的库&#xff0c;这样在最终交付应用程序时可以减少总库的大小。但如果需要依赖OpenCV的库太多,有时会带来不方便&#xff0c;此时可以使…

线上答题活动小程序结合线下大屏复盘总结

线上答题活动小程序结合线下大屏复盘总结 ~ 说来话长&#xff0c;这个活动也接近尾声了&#xff0c;从刚开始着手开发&#xff0c;到现在已过去半年&#xff0c;好不夸张的&#xff0c;当时从4月份开始接触&#xff0c;现在已经十月份了 该小程序我发下主界面截图&#xff0…

【RocketMQ集群】Linux搭建RocketMQ双主双从集群

在当今大数据时代&#xff0c;消息队列系统成为了构建高可用、可扩展和可靠的分布式应用的重要组件之一。而Apache RocketMQ作为一款开源的分布式消息中间件&#xff0c;以其高吞吐量、低延迟和可靠性而备受青睐。为了满足大规模应用的需求&#xff0c;搭建RocketMQ集群是一种常…

JavaScript进阶 第二天笔记

JavaScript 进阶 - 第2天 了解面向对象编程的基础概念及构造函数的作用&#xff0c;体会 JavaScript 一切皆对象的语言特征&#xff0c;掌握常见的对象属性和方法的使用。 了解面向对象编程中的一般概念能够基于构造函数创建对象理解 JavaScript 中一切皆对象的语言特征理解引用…

Flutter页面滑动回调处理解决方法

文章目录 TabBarViewTabBarView简介TabBarView详细介绍 TabBarView滑动时如何处理事务例子 PageControllerPageController介绍PageController 的详细介绍 TabBarView TabBarView简介 TabBarView 是 Flutter 中的一个用于显示选项卡视图的小部件。它通常与 TabBar 一起使用&am…

使用树莓派(香橙派)搭建文件共享服务器-samba服务器

域网内部通过文件共享来传输文件是一种非常方便的方式&#xff0c;小米摄像头也支持用文件共享smb模式将视频备份到局域网中的文件服务器上。之前我一直使用荣耀pro路由器游戏版&#xff0c;是自带USB接口支持文件共享服务的&#xff0c;接上USB移动硬盘&#xff0c;小米摄像头…

linux-防火墙

目录 一、防火墙概念 1.软件防火墙 2.iptables默认规则 3.iptables的五链 4.iptables动作 5.四表五链 6.iptables实例 一、防火墙概念 linux下防火墙一般分为软件防火墙、硬件防火墙 硬件防火墙&#xff1a;在硬件的级别实现防火墙过滤功能&#xff0c;性能高&#xf…

docker部署rabbitmq的坑

背景 今天用docker部署rabbitmq&#xff0c;启动都一起正常&#xff0c;但是当访问15672端口时&#xff0c;不能加载出页面。 排查 1.防火墙是否开启 ufw status2.ip是否能ping通 ping 192.168.x.x3.检查docker日志 docker psdocker logs -f 容器id4.进入容器&#xff0c…

RabbitMQ运行机制和通讯过程介绍

文章目录 1.RabbitMQ 环境搭建2.RabbitMQ简介3.RabbitMQ的优势&#xff1a;4. rabbitmq服务介绍4.1 rabbitmq关键词说明4.2 消息队列运行机制4.3 exchange类型 5.wireshark抓包查看RabbitMQ通讯过程 1.RabbitMQ 环境搭建 参考我的另一篇&#xff1a;RabbitMQ安装及使用教程&am…

UE4 材质实操记录

TexCoord的R通道是从左到右的递增量&#xff0c;G通道是从上到下的递增量&#xff0c;R通道减去0.5&#xff0c;那么左边就是【-0.5~0】区间&#xff0c;所以左边为全黑&#xff0c;Abs取绝对值&#xff0c;就达到一个两边向中间的一个递减的效果&#xff0c;G通道同理&#xf…
最新文章