当前位置: 首页 > news >正文

数据结构与算法——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.栈

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

实验一 网络基础及仿真模拟软件Packet Tracer 入门

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

建立分支提交代码

git分支 git branch 产看当前分支 git branch -a 查看所有分支 git checkout 分支名 切换分支 git checkout -b 分支名 建立分支&#xff08;仅仅是在本地建立了&#xff0c;并没有关联线上&#xff09; git push --set-upstream origin 分支名 把本地分支推到先线上 gti add …...

认识 Linux操作系统

前言 电脑由硬件和软件相构成&#xff0c;在软件中操作系统只是其中的一个分支&#xff0c;今天我们学习的Linux有是操作系统中的一种&#xff0c;不同的操作系统有自己的特点和生存生态。市面上大多数电脑自带的操作系统都是我们熟知的Windows。Linux将会为大家带来开源的新天…...

AI时代程序员的核心竞争力提升与保持之道

一、引言 ----  随着人工智能&#xff08;AI&#xff09;和生成式人工智能&#xff08;AIGC&#xff09;技术的迅速发展&#xff0c;包括chatgpt、midjourney、claude等大语言模型接连不断地涌现&#xff0c;AI辅助编程工具在程序员社区中的普及正在悄然改变我们的工作方式。…...

状态模式原理剖析

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

若伊(前后端分离)学习笔记

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

Elasticsearch学习笔记(2)

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

Vue devtools 插件

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

Ubuntu 16.04安装填坑记录

一. 问题描述&#xff1a; &#xff08;1&#xff09;Ubuntu 16.04使用USB启动盘安装时&#xff0c;出现"try ubuntu without installation"或“install ubuntu”选择&#xff0c;Enter选择安装后&#xff0c;显示器黑屏无任何显示。 原因分析&#xff1a; 显示黑…...

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时&#xff0c;可以在组件标签上多次使用v-model 五、$attrs六、$refs,与&#xffe5;parent1. 回顾标签ref属性修改组件信息2. $refs实现父修改所…...

红队信息搜集扫描使用

红队信息搜集扫描使用 红队行动中需要工具化一些常用攻击&#xff0c;所以学习一下 nmap 等的常规使用&#xff0c;提供灵感 nmap 帮助 nmap --help主机扫描 Scan and no port scan&#xff08;扫描但不端口扫描&#xff09;。-sn 在老版本中是 -sP&#xff0c;P的含义是 P…...

Python自学查漏9.28

自学查漏9.28 一、环境安装&代码执行原理&变量命名 安装 Python 代码执行原理 解析&#xff08;Parsing&#xff09;: 当你运行一个 Python 脚本时&#xff0c;Python 解释器首先会解析整个代码&#xff0c;将其转换成一种叫做“字节码”&#xff08;bytecode&…...

Java文件I/O处理之RandomAccessFile【随意存取文件】

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

Android页面跳转与返回机制详解

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

Elasticsearch学习笔记(1)

初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术&#xff0c;属于 Elastic 技术栈的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索。Logstash/Beats&#xff1a;用于数据收集。Kib…...

react是一种语言?

React 不是一种编程语言&#xff0c;而是一种用于构建用户界面的 JavaScript 库。它由 Facebook 开发&#xff0c;并广泛用于开发单页应用程序&#xff08;SPA&#xff09;。React 允许你将 UI 拆分成独立的、可复用的组件&#xff0c;这些组件可以接收输入&#xff08;称为“p…...

如何区分这个ip是真实ip,不是虚假的ip

区分一个IP地址是真实IP还是虚假IP&#xff08;伪造IP&#xff09;是非常重要的&#xff0c;特别是在网络安全、数据采集和其他与IP相关的业务场景中。虚假IP&#xff08;也称为伪造IP或假冒IP&#xff09;可以通过多种方式被创建&#xff0c;如代理、VPN、或IP欺骗&#xff08…...

【软件测试】详解软件测试中的测试级别

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

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...