数据结构与算法——Java实现 21.栈

news2024/9/28 18:29:58

目录

一、概述

二、基于链表的栈的实现

接口

链表接口实现类

测试类

​编辑

三、基于数组的栈的实现

接口

数组接口实现类

测试类


妈妈,生日快乐,希望你健康快乐没有烦恼也不会有病痛

                                                                                —— 24.9.28

一、概述

计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书

二、基于链表的栈的实现

接口

public interface Stack<E> {
    /*
        向栈顶压入元素
        Params:value-待压入值
        Returns:压入成功返回true,否则返回false
     */
    boolean push(E vale);

    /*
        从栈顶弹出元素
        Returns:栈非空返回栈顶元素,栈为空返回null
     */
    E pop();

    /*
        返回栈顶元素,不弹出
        Returns:栈非空返回栈顶元素,栈为空返回null
     */
    E peek();

    /*
        判断栈是否为空
        Returns:空返回true,非空返回false
     */
    boolean isEmpty();

    /*
        判断栈是否为满
        Returns:满返回true,空返回false
     */
    boolean isFull();
}

链表接口实现类

import java.util.Iterator;

public class LinkedListStack<E> implements Stack<E>,Iterable<E> {

    // 容量
    private int capacity;
    // 元素个数
    private int size;
    // 头指针
    private Node<E> top = new Node<>(null,null);

    public LinkedListStack(int capacity) {
        this.capacity = capacity;
    }

    /*
        向栈顶压入元素
        Params:value-待压入值
        Returns:压入成功返回true,否则返回false
    */
    @Override
    public boolean push(E value) {
        if (isFull()){
            return false;
        }
        Node<E> node = new Node<>(value, top.next);
        top.next = node;
        size++;
        return true;
    }

    /*
        从栈顶弹出元素
        Returns:栈非空返回栈顶元素,栈为空返回null
    */
    @Override
    public E pop() {
        if (isEmpty()) {
            return null;
        }
        Node<E> next = top.next;
        top.next = top.next.next;
        size--;
        return next.value;
    }

    /*
        返回栈顶元素,不弹出
        Returns:栈非空返回栈顶元素,栈为空返回null
    */
    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        Node<E> next = top.next;
        return next.value;
    }

    /*
        判断栈是否为空
        Returns:空返回true,非空返回false
    */
    @Override
    public boolean isEmpty() {
        return top.next == null;
    }

    /*
        判断栈是否为满
        Returns:满返回true,空返回false
     */
    @Override
    public boolean isFull() {
        boolean b = size == capacity;
        return b;
    }

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            Node<E> next = top.next;
            @Override
            public boolean hasNext() {
                return next != null;
            }

            @Override
            public E next() {
                E value = next.value;
                next = next.next;
                return value;
            }
        };
    }

    // 单项链表实现栈
    static class Node<E> {
        E value;
        Node<E> next;

        public Node(E value, Node<E> next) {
            this.value = value;
            this.next = next;
        }
    }
}

测试类

import org.junit.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
public class TestLinkedListStack {
    @Test
    public void push() {
        LinkedListStack<Object> stack = new LinkedListStack<>(3);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        assertFalse(stack.push(4));

        assertIterableEquals(List.of(3,2,1),stack);
    }

    @Test
    public void pop() {
        LinkedListStack<Object> stack = new LinkedListStack<>(3);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        assertEquals(3,stack.pop());
        assertEquals(2,stack.pop());
        assertEquals(1,stack.pop());
        assertNull(stack.pop());
        System.out.println(stack.isEmpty());
    }
}

三、基于数组的栈的实现

接口

public interface Stack<E> {
    /*
        向栈顶压入元素
        Params:value-待压入值
        Returns:压入成功返回true,否则返回false
     */
    boolean push(E vale);

    /*
        从栈顶弹出元素
        Returns:栈非空返回栈顶元素,栈为空返回null
     */
    E pop();

    /*
        返回栈顶元素,不弹出
        Returns:栈非空返回栈顶元素,栈为空返回null
     */
    E peek();

    /*
        判断栈是否为空
        Returns:空返回true,非空返回false
     */
    boolean isEmpty();

    /*
        判断栈是否为满
        Returns:满返回true,空返回false
     */
    boolean isFull();
}

数组接口实现类

import java.util.Iterator;

public class ArrayStack<E> implements Stack<E>,Iterable<E> {
    private E[] array;
    // 栈顶指针
    private int top;

    @SuppressWarnings("all")
    public ArrayStack(int capacity) {
        this.array = (E[]) new Object[capacity];
    }

    /*
        向栈顶压入元素
        Params:value-待压入值
        Returns:压入成功返回true,否则返回false
     */
    @Override
    public boolean push(E value) {
        if(isFull()){
            return false;
        }
        array[top] = value;
        top++;
        return true;
    }

    /*
        从栈顶弹出元素
        Returns:栈非空返回栈顶元素,栈为空返回null
    */
    @Override
    public E pop() {
        if(isEmpty()){
            return null;
        }
        E e = array[top-1];
        top--;
        return e;
    }

    /*
        返回栈顶元素,不弹出
        Returns:栈非空返回栈顶元素,栈为空返回null
    */
    @Override
    public E peek() {
        if(isEmpty()){
            return null;
        }
        E e = array[top-1];
        return e;
    }

    /*
        判断栈是否为空
        Returns:空返回true,非空返回false
    */
    @Override
    public boolean isEmpty() {
        return top == 0;
    }

    /*
        判断栈是否为满
        Returns:满返回true,空返回false
    */
    @Override
    public boolean isFull() {
        return top == array.length;
    }

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            int p = top;
            @Override
            public boolean hasNext() {
                return p > 0;
            }

            @Override
            public E next() {
                E e = array[p-1];
                p--;
                return e;
            }
        };
    }
}

测试类

import org.junit.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

public class TestArrayStack {
    @Test
    public void push() {
        ArrayStack<Object> stack = new ArrayStack<>(3);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        assertFalse(stack.push(4));

        assertIterableEquals(List.of(3,2,1),stack);
    }

    @Test
    public void pop() {
        ArrayStack<Object> stack = new ArrayStack<>(3);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        assertEquals(3,stack.pop());
        assertEquals(2,stack.pop());
        assertEquals(1,stack.pop());
        assertNull(stack.pop());
        System.out.println(stack.isEmpty());
    }
}

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

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

相关文章

构造性神经组合优化的学习编码需要反悔

文章目录 Abstract1 Introduction2 Related Work用于构造性启发式的深度强化学习当前用于更好编码的方法3 LCH-Regret学习构造性启发式反悔机制LCH - Regret 机制的 L R L_R LR​Abstract 深度强化学习的神经组合优化中,学习构造性启发式(LCH)通过快速的自回归解构建过程实…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

《开题报告》基于SpringBoot框架的高校专业实习管理系统开题报告的设计与实现源码++学习文档+答辩讲解视频

开题报告 研究背景 在当今高等教育日益普及与深化的背景下&#xff0c;高校专业实习作为学生将理论知识转化为实践能力、提前适应社会工作环境的重要环节&#xff0c;其重要性不言而喻。然而&#xff0c;传统的高校专业实习管理模式往往存在信息不对称、流程繁琐、效率低下、…

C# Blazor Server 调用海康H5Player播放摄像头画面

目标 调用海康综合安防平台api&#xff0c;通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api&#xff0c;得到websocket 的url&#xff0c;然后在blazor server中使用htplayer.js播放摄像头实时画面。 步骤 根据摄像头名字&#xff0c;调用【查询监控点列表v2…

CGAL Surface_Mesh 示例

CGAL Surface_Mesh 示例 创建一个简单的网格曲面Surface_Mesh对象&#xff0c;然后通过半边结构遍历某个面的顶点以及遍历整个网格对象的所有顶点&#xff0c;最后计算网格所有顶点的3D凸包网格。 项目 sm_points.cpp #include <CGAL/Simple_cartesian.h> #include &l…

Virtio半虚拟化基本原理简介

virtio半虚拟化基本原理简介 在本文中&#xff0c;将首先了解VirtIO的基本概念及其应用原因&#xff0c;然后从技术角度深入探讨VirtIO的关键领域&#xff0c;包括VirtIO设备与驱动程序、VirtQueues和VRings。在介绍完这些基础知识后&#xff0c;将通过一个在Qemu中的VirtIO设备…

【C++】函数模板,类模板,全特化,偏特化详解

目录 1. 函数模板 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.4.1 隐式实例化 1.4.2 显示实例化 1.5 模板参数的匹配原则 2. 类模板 2.1 类模板的定义格式 2.2 类模板的实例化 3. 非类型模板参数 4. 模板的特化 4.1 类模板…

AI动漫转真人终极教程!3步做出爆款内容,音乐推广号变现

从小到大&#xff0c;我们看过的动漫、玩过的游戏有很多很多 但我们会发现里面的角色或者人物都是二次元的 我就会好奇这些动漫人物在现实中会长什么样 而现在&#xff0c;我们通过AI绘画竟然就能还原出来他们现实中的样子 除了动漫角色和游戏人物&#xff0c;古代的画像、…

flink设置保存点和恢复保存点

增加了hdfs package com.qyt;import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.runtime.state.storage.FileSystemCheckpointStorage;import org.apache.flink.streaming.api.datastream.Dat…

C++友元和运算符重载

目录 一. 友元 friend 1.1 概念 1.2 友元函数 1.3 友元类 1.4 友元成员函数 二. 运算符重载 2.1 概念 2.2成员函数运算符重载 2.3 成员函数运算符重载 2.4 特殊运算符重载 2.4.1 赋值运算符重载 2.4.2 类型转换运算符重载 2.5 注意事项 三、std::string 字符串类…

什么是期望最大化算法?

一、期望最大化算法 期望最大化&#xff08;EM&#xff09;算法是一种在统计学和机器学习中广泛使用的迭代方法&#xff0c;它特别适用于含有隐变量的概率模型参数估计问题。在统计学和机器学习中&#xff0c;有很多不同的模型&#xff0c;例如高斯混合模型&#xff08;GMM&…

NSSCTF [HNCTF 2022 Week1]超级签到

查看主函数 看到遍历 Str2&#xff0c;如果字符为 o&#xff0c;则替换为 0 int __fastcall main_0(int argc, const char **argv, const char **envp) {char *v3; // 指向 v7 的指针__int64 i; // 循环计数器size_t v5; // 存储 Str2 的长度char v7; // 存储输入字符int j; …

如何快速自定义一个Spring Boot Starter!!

目录 引言&#xff1a; 一. 我们先创建一个starter模块 二. 创建一个自动配置类 三. 测试启动 引言&#xff1a; 在我们项目中&#xff0c;可能经常用到别人的第三方依赖&#xff0c;又是引入依赖&#xff0c;又要自定义配置&#xff0c;非常繁琐&#xff0c;当我们另一个项…

mysql8.0安装后没有my.ini

今天安装mysql后想改一下配置文件看了一下安装路径 C:\Program Files\MySQL\MySQL Server 8.0 发现根本没有这个文件查看隐藏文件也没用查了之后才知道换地方了和原来的5.7不一样 新地址是C:\ProgramData\MySQL\MySQL Server 8.0 文件也是隐藏的记得改一下配置

【Redis 源码】7RDB持久化

1 功能说明 RDB (Redis Database Backup) 是 Redis 的一种持久化方式&#xff0c;它通过将某一时刻的内存快照&#xff08;snapshot&#xff09;以二进制格式保存到磁盘上。这种持久化方式提供了高性能和紧凑的数据存储&#xff0c;但相对于 AOF (Append Only File) 来说&…

充电桩安装-理想充电桩如何安装全流程-从准备到材料准备全流程

充电桩安装 Willya 2023年3月6日 新能源车出行成本低&#xff0c;那肯定是要在便利的条件下&#xff0c;得有自己的充电桩才行&#xff0c;实在安装不了自己的充电桩&#xff0c;那也要保证居住周边有充足的充电站&#xff0c;这样才能保证用车的便捷。 理想汽车充电桩安装一般…

智能化转型新篇章:EasyCVR引领大型连锁超市视频监控进入AI时代

随着科技的飞速发展&#xff0c;视频监控系统在各行各业中的应用日益广泛&#xff0c;大型连锁超市作为人员密集、商品繁多的公共场所&#xff0c;其安全监控显得尤为重要。为了提升超市的安全管理水平、减少损失、保障顾客和员工的安全&#xff0c;引入高效、全面的视频监控系…

胤娲科技:AI界的超级充电宝——忆阻器如何让LLM告别电量焦虑

当AI遇上“记忆橡皮擦”&#xff0c;电量不再是问题&#xff01; 嘿&#xff0c;朋友们&#xff0c;你们是否曾经因为手机电量不足而焦虑得像个无头苍蝇&#xff1f;想象一下&#xff0c;如果这种“电量焦虑”也蔓延到了AI界&#xff0c; 特别是那些聪明绝顶但“耗电如喝水”的…

逃离陷阱:如何巧妙避免机器学习中的过拟合与欠拟合

逃离陷阱&#xff1a;如何巧妙避免机器学习中的过拟合与欠拟合 前言过拟合&#xff1a;定义与识别定义表现原因示例&#xff1a;决策树模型的过拟合 欠拟合&#xff1a;定义与识别定义表现原因示例&#xff1a;线性回归模型的欠拟合 避免过拟合的策略减少模型复杂度使用正则化…

基于nodejs+vue的校园二手物品交易系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…