数据结构与算法——Java实现 21.栈
目录
一、概述
二、基于链表的栈的实现
接口
链表接口实现类
测试类
编辑
三、基于数组的栈的实现
接口
数组接口实现类
测试类
妈妈,生日快乐,希望你健康快乐没有烦恼也不会有病痛
—— 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*/@Overridepublic boolean push(E value) {if (isFull()){return false;}Node<E> node = new Node<>(value, top.next);top.next = node;size++;return true;}/*从栈顶弹出元素Returns:栈非空返回栈顶元素,栈为空返回null*/@Overridepublic E pop() {if (isEmpty()) {return null;}Node<E> next = top.next;top.next = top.next.next;size--;return next.value;}/*返回栈顶元素,不弹出Returns:栈非空返回栈顶元素,栈为空返回null*/@Overridepublic E peek() {if (isEmpty()) {return null;}Node<E> next = top.next;return next.value;}/*判断栈是否为空Returns:空返回true,非空返回false*/@Overridepublic boolean isEmpty() {return top.next == null;}/*判断栈是否为满Returns:满返回true,空返回false*/@Overridepublic boolean isFull() {boolean b = size == capacity;return b;}@Overridepublic Iterator<E> iterator() {return new Iterator<E>() {Node<E> next = top.next;@Overridepublic boolean hasNext() {return next != null;}@Overridepublic 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 {@Testpublic 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);}@Testpublic 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*/@Overridepublic boolean push(E value) {if(isFull()){return false;}array[top] = value;top++;return true;}/*从栈顶弹出元素Returns:栈非空返回栈顶元素,栈为空返回null*/@Overridepublic E pop() {if(isEmpty()){return null;}E e = array[top-1];top--;return e;}/*返回栈顶元素,不弹出Returns:栈非空返回栈顶元素,栈为空返回null*/@Overridepublic E peek() {if(isEmpty()){return null;}E e = array[top-1];return e;}/*判断栈是否为空Returns:空返回true,非空返回false*/@Overridepublic boolean isEmpty() {return top == 0;}/*判断栈是否为满Returns:满返回true,空返回false*/@Overridepublic boolean isFull() {return top == array.length;}@Overridepublic Iterator<E> iterator() {return new Iterator<E>() {int p = top;@Overridepublic boolean hasNext() {return p > 0;}@Overridepublic 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 {@Testpublic 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);}@Testpublic 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());}
}
相关文章:

数据结构与算法——Java实现 21.栈
目录 一、概述 二、基于链表的栈的实现 接口 链表接口实现类 测试类 编辑 三、基于数组的栈的实现 接口 数组接口实现类 测试类 妈妈,生日快乐,希望你健康快乐没有烦恼也不会有病痛 —— 24.9.28 一、概述 计算机科学中,stack是一种线性的…...

实验一 网络基础及仿真模拟软件Packet Tracer 入门
实验一 网络基础及仿真模拟软件Packet Tracer 入门 【实验目的】 一、认识 Packet Tracer 。 二、学习使用 Packet Tracer 进行拓扑的搭建。 三、学习使用 Packet Tracer 对设备进行配置,并进行简单的测试。 【实验内容和结果】 一、拖放设备和布置线缆 二、用…...

建立分支提交代码
git分支 git branch 产看当前分支 git branch -a 查看所有分支 git checkout 分支名 切换分支 git checkout -b 分支名 建立分支(仅仅是在本地建立了,并没有关联线上) git push --set-upstream origin 分支名 把本地分支推到先线上 gti add …...
认识 Linux操作系统
前言 电脑由硬件和软件相构成,在软件中操作系统只是其中的一个分支,今天我们学习的Linux有是操作系统中的一种,不同的操作系统有自己的特点和生存生态。市面上大多数电脑自带的操作系统都是我们熟知的Windows。Linux将会为大家带来开源的新天…...
AI时代程序员的核心竞争力提升与保持之道
一、引言 ---- 随着人工智能(AI)和生成式人工智能(AIGC)技术的迅速发展,包括chatgpt、midjourney、claude等大语言模型接连不断地涌现,AI辅助编程工具在程序员社区中的普及正在悄然改变我们的工作方式。…...

状态模式原理剖析
《状态模式原理剖析》 状态模式(State Pattern) 是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。换句话说,当对象状态发生变化时,它的行为也会随之变化。 通过状态模式,可以消除通过 if-else…...

若伊(前后端分离)学习笔记
基础应用篇 1. 若伊搭建 若伊版本 若依官方针对不同开发需求提供了多个版本的框架,每个版本都有其独特的特点和适用场景: 前后端混合版本 :RuoYi结合了SpringBoot和Bootstrap的前端开发框架,适合快速构建传统的Web应用程序&…...

Elasticsearch学习笔记(2)
索引库操作 在Elasticsearch中,Mapping是定义文档字段及其属性的重要机制。 Mapping映射属性 type:字段数据类型 1、字符串: text:可分词的文本,适用于需要全文检索的情况。keyword:用于存储精确值&am…...

Vue devtools 插件
一、安装 去这下载https://chrome.zzzmh.cn/ 打开chrome的扩展程序 再打开开发模式 把刚才下载的拖到这里 然后把它固定到工具栏 就是这样了。 二、使用 程序通过open on live server后,打开开发者工具,找到vue就可以了。 这是代码 <div id"ap…...

Ubuntu 16.04安装填坑记录
一. 问题描述: (1)Ubuntu 16.04使用USB启动盘安装时,出现"try ubuntu without installation"或“install ubuntu”选择,Enter选择安装后,显示器黑屏无任何显示。 原因分析: 显示黑…...
python的pyinstaller
1、pyinstaller --onefile -w *.py 可以生成可执行文件 -w就是不需要有console窗体出现、 2、 console窗体会出现一些警告。 比如 Warning: QT_DEVICE_PIXEL_RATIO is deprecated. Instead use: QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-scre…...

Vue3(五) 组件通信大汇总
文章目录 一、props二、自定义事件三、mitt四、v-model1.v-model的本质2.v-model用在组件标签上3.更换modelValue4.更换modelValue时,可以在组件标签上多次使用v-model 五、$attrs六、$refs,与¥parent1. 回顾标签ref属性修改组件信息2. $refs实现父修改所…...

红队信息搜集扫描使用
红队信息搜集扫描使用 红队行动中需要工具化一些常用攻击,所以学习一下 nmap 等的常规使用,提供灵感 nmap 帮助 nmap --help主机扫描 Scan and no port scan(扫描但不端口扫描)。-sn 在老版本中是 -sP,P的含义是 P…...
Python自学查漏9.28
自学查漏9.28 一、环境安装&代码执行原理&变量命名 安装 Python 代码执行原理 解析(Parsing): 当你运行一个 Python 脚本时,Python 解释器首先会解析整个代码,将其转换成一种叫做“字节码”(bytecode&…...

Java文件I/O处理之RandomAccessFile【随意存取文件】
Java语言有一个处理文件输入输出的RandomAccessFile类,既可以读取文件内容,也可以向文件输出数据。 RandomAccessFile类在国内的技术文档和书籍中都翻译为“随机访问文件”类,确实令人不解。 在中文中“随机”的意思: 不设任何条…...

Android页面跳转与返回机制详解
在Android开发中,页面跳转是实现应用功能交互的重要手段之一。本文将从Activity之间的跳转、Activity与Fragment之间的跳转、Fragment之间的跳转以及页面返回的问题四个方面进行详细解析。 一、Activity之间的跳转 Activity是Android应用的基本构建块,…...

Elasticsearch学习笔记(1)
初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术,属于 Elastic 技术栈的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索。Logstash/Beats:用于数据收集。Kib…...
react是一种语言?
React 不是一种编程语言,而是一种用于构建用户界面的 JavaScript 库。它由 Facebook 开发,并广泛用于开发单页应用程序(SPA)。React 允许你将 UI 拆分成独立的、可复用的组件,这些组件可以接收输入(称为“p…...
如何区分这个ip是真实ip,不是虚假的ip
区分一个IP地址是真实IP还是虚假IP(伪造IP)是非常重要的,特别是在网络安全、数据采集和其他与IP相关的业务场景中。虚假IP(也称为伪造IP或假冒IP)可以通过多种方式被创建,如代理、VPN、或IP欺骗(…...

【软件测试】详解软件测试中的测试级别
目录 一、测试级别二、组件测试三、开发者测试3.1测试与调试3.2 组件测试目标3.3 测试功能 四、稳健性测试4.1 效率的测试4.2 测试可维护性4.3 测试策略4.4 白盒测试 一、测试级别 软件系统通常是由许多子系统组成的,而这些子系统又是由多个组件组成的,…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...