java数据结构YZP专栏版-----堆栈

华为OD机试真题 2026.11.4. 新系统 【河流水系流量评估】 华为OD机试真题 新系统【河流水系流量评估】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【河流水系流量评估】多语言题解。 阅读详情
主文章(数据结构的索引目录—进不去就说明我还没写完)
https://blog.youkuaiyun.com/grd_java/article/details/122377505
模拟数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
源码
  1. 码云:https://gitee.com/yin_zhipeng/data_structures_and_algorithms_in_java.git
堆栈

1. 堆栈,先入后出的数据结构。
2. 同一时刻只允许访问一个数据项,也就是最后一个数据

一、堆栈

1. 数组实现(Stack Array Implementation)

动画演示
  1. 入栈
    请添加图片描述
  2. 出栈
    请添加图片描述
实现思路
  1. 定义一个数组表示栈
  2. 定义一个变量top指向可以入栈的位置初始为0(也可以初始-1,指向最后一个数据)
  3. 入栈:以top为下标插入数据,然后top后移
  4. 出栈:以top为下标取出数据,然后top前移
代码:com/yzpnb/data_structures/stack/array_implementation/Stack.java
  1. 运行效果
    在这里插入图片描述
import java.util.Arrays;

public class Stack<E> {
    private int top = 0;//栈顶指针,总是指向最后一个可插入位置,如果等于array.length,表示栈满
    private Object[] array;//用数组实现
    //构建栈
    public Stack(){
        this.array = new Object[10];//默认栈初始大小10
        System.out.println("栈初始成功!!!初始大小10");
    }
    public Stack(int size){
        this.array = new Object[size];//指定栈大小
        System.out.println("栈初始成功!!!初始大小"+size);
    }

    //栈满
    public boolean isFull(){
        return top==array.length;
    }
    //栈空
    public boolean isEmpty(){
        return top == 0;
    }
    //数组扩容
    private void arrayExtend(){
        array = Arrays.copyOf(array, array.length * 2);
    }

    //入栈
    public void push(E o){
        if(isFull()){//栈满扩容
            arrayExtend();
            System.out.println("栈满扩容");
        }
        array[top] = o;
        top++;
        System.out.println((E)o+"入栈成功");
    }
    //返回栈顶数据,不对栈做操作
    public E peek(){
        if(isEmpty()){
            return null;
        }
        return (E)array[top-1];
    }

    //出栈
    public E pop(){
        if(top == 0){
            throw new RuntimeException("栈已空!!!");
        }
        System.out.print("出栈");
        return (E)array[--top];
    }

    //测试程序
    public static void main(String[] args) {
        Stack<Integer> integerStack = new Stack<>(2);
        integerStack.push(1);
        integerStack.push(2);
        integerStack.push(3);
        System.out.println(integerStack.pop());
        System.out.println(integerStack.pop());
        System.out.println(integerStack.pop());
        System.out.println(integerStack.pop());
    }
}

2. 链表实现(Linked List Implementation)

动画演示
  1. 入栈
    请添加图片描述
  2. 出栈
    请添加图片描述
实现思路
  1. 定义一个链表作为栈,链表每个结点拥有一个前驱
  2. 定义一个变量top指向栈尾(链表最后一个结点)
  3. 入栈:链表长度为空,top指向当前插入结点,当前插入结点前驱为null;否则让新插入结点前驱指向当前top指向的结点,然后top指向当前插入结点
  4. 出栈:top当前指向结点返回,top前移
代码:com/yzpnb/data_structures/stack/linked_list_implementation/Stack.java
  1. 运行效果
    在这里插入图片描述
public class Stack<E> {
    /**
     * 链表结点
     */
    private static class Node<E> {
        E item;
        Stack.Node<E> prev;

        Node(Node<E> prev, E element) {
            this.item = element;
            this.prev = prev;
        }
    }

    private Node<E> top = null;//栈顶,初始为空

    private final Integer MAXSIZE = 65536;//栈最大为65536

    private Integer size = 6;//当前栈大小,初始为6

    private Integer length = 0;//当前元素个数

    //构建栈
    public Stack(){
        System.out.println("栈初始成功,当前栈没有元素,大小为6");
    }
    public Stack(int size){
        this.size = size;
        System.out.println("栈初始成功,当前栈没有元素,大小为"+size);
    }
    public Stack(E e){//直接构建头结点
        Node<E> eNode = new Node<>(null, e);
        this.length++;
        this.top = eNode;
        System.out.println("栈初始成功!!!当前栈顶元素为:"+top.item+",栈大小为6");
    }
    public Stack(E e,int size){//直接构建头结点,指定初始大小
        this.size = size;
        Node<E> eNode = new Node<>(null, e);
        this.top = eNode;
        this.length++;
        System.out.println("栈初始成功!!!当前栈顶元素为:"+top.item+",栈大小为"+size);
    }

    //栈满
    public boolean isFull(){
        return length == size;
    }
    //栈空
    public boolean isEmpty(){
        return length == 0;
    }
    //扩容,每次*2
    private void extendStack(){
        if(size == MAXSIZE){
            throw new RuntimeException("栈大小已达上限!!!");
        }
        if(size*2>=MAXSIZE){
            size = MAXSIZE;
        }else if(size*2<MAXSIZE) {
            size *= 2;
        }
    }

    //入栈
    public void push(E e){
        if(isFull()){//栈满扩容
            extendStack();
            System.out.println("栈满扩容");
        }
        if(top == null){
            Node<E> eNode = new Node<>(null, e);
            this.top = eNode;
            this.length++;
        }else{
            Node<E> eNode = new Node<>(top, e);
            this.top = eNode;
            this.length++;
        }
        System.out.println((E)e+"入栈成功");
    }
    //返回栈顶数据,不对栈做操作
    public E peek(){
        if(isEmpty()){
            return null;
        }
        return top.item;
    }

    //出栈
    public E pop(){
        if(isEmpty()){
            throw new RuntimeException("栈已空!!!");
        }
        System.out.print("出栈");
        E item = top.item;
        top = top.prev;
        this.length--;
        return item;
    }

    //测试程序
    public static void main(String[] args) {
        Stack<Integer> integerStack = new Stack<>(2);
        integerStack.push(1);
        integerStack.push(2);
        integerStack.push(3);
        System.out.println(integerStack.pop());
        System.out.println(integerStack.pop());
        System.out.println(integerStack.pop());
        System.out.println(integerStack.pop());
    }
}

二、实战

1. 字符串反转

思路
  1. 利用栈先进后出特性,依次入栈字符串,然后依次出栈,即可完成反转
动画演示
  1. 入栈
    请添加图片描述
  2. 出栈
    请添加图片描述
代码:
  1. 运行效果
    在这里插入图片描述
import com.yzpnb.data_structures.stack.array_implementation.Stack;

public class StringReverse {
    public static void main(String[] args) {
        String str = "apple";
        Stack<Character> characterStack = new Stack<>();
        for (char c : str.toCharArray()) {
            characterStack.push(c);
        }
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0;i<str.length();i++){
            stringBuffer.append(characterStack.pop());
        }
        System.out.println("\n"+str+"---字符串反转后---"+stringBuffer);
    }
}

2. 括号匹配

题目:判断字符串括号是否配对
  1. 判断字符串中的括号是否配对“a{b(]c}d”,比如这个字符串“(”找不到配对,则程序结束返回不匹配
思路
  1. 遇到左括号,就入栈
  2. 遇到右括号,出栈,比较,不配对程序结束
    在这里插入图片描述
代码:com/yzpnb/data_structures/stack/example/bracket_match/BracketMatch.java
  1. 运行效果
    在这里插入图片描述
    在这里插入图片描述
import com.yzpnb.data_structures.stack.linked_list_implementation.Stack;

public class BracketMatch {
    public static void main(String[] args) {
        String str = "a{b(]c}d";//不匹配的
//        String str = "{[()]}";//匹配的
        Stack<Character> stack = new Stack<>();
        System.out.println("开始匹配字符串:"+str+"的括号是否匹配");
        for (Character c:str.toCharArray()) {
            switch (c){
                case '{' :
                case '[' :
                case '(' :{
                    stack.push(c);
                    break;
                }
                case ')':
                case ']':
                case '}':{
                    System.out.println("匹配右括号:"+c);
                    if(stack.isEmpty()){
                        System.out.println("不匹配");
                        return;
                    }
                    Character peek = stack.peek();//就用来输出一下
                    if(!check(c,stack.pop())){
                        System.out.println(peek+"与括号"+c+"不匹配");//输出
                        return;
                    }
                }
            }
        }
        System.out.println("字符串括号完全匹配");
    }
    public static boolean check(char a,char b){
        System.out.println();
        switch (a) {
            case '}':{
                return b=='{';
            }
            case ']':{
                return b=='[';
            }
            case ')':{
                return b=='(';
            }
        }
        return false;
    }
}
SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

树莓派5首次开机保姆级教程(无显示器通过VNC连接树莓派桌面)

选择 Interface Options > VNC > Yes 启用服务。2.在Windows电脑上安装VNC软件。重启树莓派:sudo reboot。3.使用VNC远程访问树莓派桌面。

qq_34184505的博客 2351

java数据结构YZP专栏版-----主目录-----持续更新

本文相当于目录方便快速检索内容,没有实际内容,只做索引

殷志鹏的博客 370

南京邮电大学电工电子基础B实验六(组合逻辑电路)

南京邮电大学电工电子基础B实验五(组合逻辑电路);电工电子;南京邮电大学;计算机学院;实验报告;电路图;

亦是远方的小地方 1万+

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 292

Image Sensor常见分辨率下HTS,VTS设置

image sensor,HTS,VTS

propor的专栏 4974

PDD psnl_verification anti_content 生成顺序与环境校验说明

K不是明文 URL,而是从当前href再派生出来的一小段摘要值。页面 URL 变,K会跟着变但K不是直接肉眼可读的 URL 字串可以把它理解成“URL 的短摘要字段”。这一步是最容易被误解的地方。它吃进去的是压缩后的中间串不是直接吃环境字段它内部还带有长度预算 / 字符映射 / 位置处理逻辑所以最终看到的环境字段 bytes协议头deflate 压缩自定义编码多层叠加后的结果。先把字段总包做再把压缩结果转成raw再拼fTail最后走做字符级输出因此,当前看到的协议字段流。

码王吴彦祖的博客 69

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 349

Python 爬虫实战:微信搜一搜内容深度爬取(含搜索结果解析与企业级架构设计)

在信息爆炸的时代,微信搜一搜已成为海量信息获取的重要入口。无论是个人知识探索,还是企业舆情监控,掌握微信搜一搜内容的深度爬取能力具有巨大价值。本文将从基础原理到企业级实现,全面解析微信搜一搜爬虫的开发过程。

yansideyucsdn的博客 2455

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 144

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

a_zxswer的博客 190

17、神经网络训练算法与高阶模糊Cohen - Grossberg神经网络稳定性分析

本文介绍了一种新的数据驱动算法用于神经网络训练,该算法继承三次样条权重函数的优点,具有简单架构和良好泛化性能,并通过并行机制显著提升训练速度。同时,研究了高阶模糊Cohen-Grossberg神经网络(HOFCGNN)在可变及无界延迟下的稳定性,利用M矩阵理论和向量Lyapunov函数方法,证明了系统平衡点的存在性、唯一性和全局指数稳定性。研究成果为神经网络的高效训练与稳定应用提供了理论支持和技术路径。

b9c0d的博客 149

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 206

在 RAP 里把编号这件事做得既优雅又合规:Early Numbering 与 Late Numbering 的落地指南

本文探讨了 SAP RAP 框架中的三种主键编号策略及其适用场景。文章首先指出传统 ABAP 应用中主键处理的局限性,详细分析了早期编号(外部/内部)和延迟编号的差异,强调延迟编号在避免业务断号方面的优势。通过 Partner 业务对象案例,文章演示了延迟编号的实现方法,包括行为定义配置、保存类实现和编号分配逻辑。同时指出测试中常见的校验陷阱,并提醒生产环境应避免简单的 MAX+1 方案,建议采用原子取号机制确保并发安全。全文从业务合规性和技术实现两个维度,为 RAP 应用的编号策略选择提供了实用指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1846

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 368

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 509

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 637

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 348

java框架大全

java框架大全

qq_39326137的博客 184

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 365

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 300

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 160

Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

【代码】Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

m0_64476639的博客 331

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 343

TRingBuffer两端都能增删(快递站版)

TRingBuffer 是一个支持两端增删、下标访问且容量动态增长的环形双端队列。它通过无符号索引的永不归零设计,利用减法自动模运算实现空满判断与元素计数,避免了传统环形缓冲浪费格子的问题。内部以票号(索引)标记首尾,扩容时重排元素为连续存储,保证 O(1) 操作与高缓存效率。虽不线程安全,但其高效性使其成为游戏开发中事件队列、命令缓冲等场景的理想选择。

u013768914的博客 301

Mac上装了最新版本的Android Studio,但是没找到jdk的设置选项也没找到jbr的目录

新版Android Studio(2025.3.1+)因三项变更导致常见问题:一、JDK设置移至“DaemonJVM criteria”,新项目默认自动探测或下载JDK;二、JBR目录改名为带版本号的jbr-21等,需进入.app/Contents/查看,或通过About窗口确认运行时;三、命令行缺adb因platform-tools未加入PATH,需在SDK Manager中勾选并配置~/.zshrc中的ANDROID_HOME及PATH。重装或清理残留可解决缺失问题,切勿手动设JAVA_HOME或安装冲

Programming is a highly artistic endeavor 361

Spring事务和事务传播机制

3. 可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改, 即使其他事务已提交. 也就可以确保同⼀事务多次查询的结果⼀致, 但是其他事务新插⼊的数据, 是可以感知到的. 这也就引发了幻读问题. 可重复读, 是 MySQL 的默认事务隔离级别.p1事务可以认为是⽗事务, 嵌套事务是⼦事务. ⽗事务出现异常, ⼦事务也会回滚, ⼦事务出现异常, 如果不进⾏处理, 也会导致⽗事务回滚.

txxzjmzlh的博客 207
上一篇: java设计模式---- 桥接模式
下一篇: 实现自己的Tomcat、Servlet、多线程(线程池)处理请求
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值