栈(Java)

目录

1.什么是栈

2.栈的使用

3.栈的模拟实现


1.什么是栈

栈:是一种特殊的线性表,只允许在其固定的一端进行插入和删除操作。栈中的元素遵循先进后出(后进先出)原则

栈顶:进行插入和删除数据的一端

栈底:始终不进行插入和删除操作的一端

压栈:栈的插入操作,也可叫做进栈、入栈

出栈:栈的删除操作

压栈和出栈都在栈顶 

栈类似于弹夹,栈中的元素类似于子弹,最先放入弹夹中的子弹最后打出,最后放入弹夹中的子弹最先打出,同样的,先入栈的元素后出栈,后入栈的元素先出栈

2.栈的使用

栈中存储的是相同类型的数据,因此可以使用链表或是数组来实现栈,而在Java中,提供了Stack类,是用数组实现的栈。

Stack类位于 java.util 包中,使用前需要导包 

import java.util.Stack;

Stack的构造方法:

 Stack()

无参构造方法,构造一个空的栈

Stack<Integer> stack = new Stack<>();

常用的方法:

E push(E e)

作用:将e入栈,并返回e 

class Test{public static void main(String[] args) {Stack<Integer> stack = new Stack<>();//创建一个空的栈,栈中存放数据类型为Integerstack.push(3);//将3压入栈中,并返回3stack.push(55);System.out.println(stack.push(44));//输出:33System.out.println(stack);//输出:[3, 55, 44]}
}

 E pop()

作用:将栈顶元素出栈并返回

class Test{public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(22);stack.push(33);System.out.println(stack.pop());//输出:33}
}

 若栈中无元素,调用pop()方法,会抛出异常 EmptyStackException 

E peek()

作用:获取栈顶元素,但不将栈顶元素出栈

class Test{public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(22);stack.push(33);stack.push(44);System.out.println(stack.peek());//输出:44System.out.println(stack);//输出:[22, 33, 44]}
}

若栈中无元素,调用peek()方法时,也会抛出异常 EmptyStackException 

int size()

作用:获取栈中有效元素个数

boolean empty()

作用:判断栈是否为空

class Test{public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(22);stack.push(33);stack.push(44);System.out.println(stack.size());//输出:3System.out.println(stack.isEmpty());//输出:false}
}

3.栈的模拟实现

我们可以使用链表或是数组来模拟栈

(1)使用数组模拟实现栈

先定义栈,和栈的构造方法

public class MyStack {private int[] elem;//使用数组模拟实现栈private int usedSize;//表示有效长度,同时也可表示当前位置可以存放元素private static final int DEFAULT_CAPACITY = 10;public MyStack(){//初始化栈this.elem = new int[DEFAULT_CAPACITY];}
}

计算栈中元素个数

//计算栈中元素个数
public int size(){return this.usedSize;
}

判断栈是否为空

若usedSize为0则表明栈中没有元素,返回true,反之,返回false

public boolean empty(){return usedSize == 0;
}

入栈

将元素放入栈中,首先要判断栈是否满了,若满了,则需要先扩容,再将元素放入栈中

//入栈
public void push(int data){//先判断栈是否满if(usedSize == elem.length){//扩容elem = Arrays.copyOf(elem,2*elem.length);}//将data放入栈中,并将usedSize+1elem[usedSize++] = data;
}

出栈

若栈为空,则抛出异常;不为空,则将栈顶元素出栈

public int pop(){if(empty()){throw new EmptyStackException();}int data = elem[usedSize-1];usedSize--;return data;
}

获取栈顶元素

若栈为空,抛出异常;不为空,返回栈顶元素

public int peek(){if(empty()){throw new EmptyStackException();}int data = elem[usedSize-1];return data;
}

完整代码

import java.util.Arrays;
import java.util.EmptyStackException;public class MyStack {private int[] elem;//使用数组模拟实现栈private int usedSize;//表示有效长度,同时也可表示当前位置可以存放元素private static final int DEFAULT_CAPACITY = 10;public MyStack(){//初始化栈this.elem = new int[DEFAULT_CAPACITY];}//计算栈中元素个数public int size(){return this.usedSize;}//判断栈是否为空public boolean empty(){return usedSize == 0;}//入栈public void push(int data){//先判断栈是否满if(usedSize == elem.length){//扩容elem = Arrays.copyOf(elem,2*elem.length);}//将data放入栈中,并将usedSize+1elem[usedSize++] = data;}//出栈public int pop(){if(empty()){throw new EmptyStackException();}int data = elem[usedSize-1];usedSize--;return data;}//获取栈顶元素public int peek(){if(empty()){throw new EmptyStackException();}int data = elem[usedSize-1];return data;}
}

(2)使用链表模拟实现栈

public class MyStack {static class ListNode {private int val;private ListNode next;public ListNode(int val) {this.val = val;}}private ListNode head;private int size;//判断栈是否为空public boolean empty(){return size == 0;}//计算栈中元素个数public int size(){return size;}//入栈public void push(int data){ListNode node = new ListNode(data);//头插if(empty()) {this.head = node;}else {node.next = this.head;this.head = node;}size++;}//出栈public int pop(){if(empty()){throw new EmptyStackException();}//头删int data = head.val;head = head.next;size--;return data;}//查看栈顶元素public int peek(){if(empty()){throw new EmptyStackException();}return head.val;}public void display() {ListNode cur = this.head;while (cur != null) {System.out.print(cur.val+" ");cur = cur.next;}System.out.println();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么压缩word文档的大小?

怎么压缩word文档的大小&#xff1f;Word文件压缩成一个普遍存在的挑战&#xff0c;现在看来至少是这样的。最近&#xff0c;我们接到了许多用户的疑问&#xff0c;他们想知道如何压缩Word文件大小。这个问题似乎广泛存在于办公场景中&#xff0c;因此我们需要找到解决方案。导…

测试用例:在线音乐播放器

从 功能测试、界面测试、性能测试、兼容性测试、易用性测试、安全测试、弱网测试等 七个方面对在线音乐播放器进行设计测试用例

【广州华锐互动】利用VR开展工业事故应急救援演练,确保救援行动的可靠性和有效性

在工业生产中&#xff0c;事故的突发性与不可预测性常常带来巨大的损失。传统的应急演练方式往往存在场地限制、成本高、效果难以衡量等问题。然而&#xff0c;随着虚拟现实&#xff08;VR&#xff09;技术的快速发展&#xff0c;VR工业事故应急救援演练应运而生&#xff0c;为…

Cannot find module ‘core-js/modules/es6.regexp.constructor‘

npm run dev 之后报如下错误 解决方法&#xff1a;npm install core-js2 如果超时或者下载时间慢可以尝试 用cnpm install core-js2

Exception in thread “main“ java.sql.SQLException: No suitable driver

详细报错信息如下&#xff1a; Exception in thread "main" java.sql.SQLException: No suitable driver at java.sql.DriverManager.getDriver(DriverManager.java:315) at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.$anonfun$driverC…

宝塔nginx搭建Ftp文件服务器

一&#xff1a;创建FTP 填入账号密码后&#xff0c;选择根目录&#xff0c;这个根目录就是nginx要代理的目录 二&#xff1a;配置nginx root的地址就是上面填的FTP根目录 三&#xff1a;http访问 服务器ip端口号加图片 例如我放了一个320.jp 我服务器ip是110.120.120.120 那…

PSINS工具箱学习(二)姿态的表示:姿态阵、四元数、欧拉角、等效旋转矢量的概念和转换

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、基础概念1、坐标系定义1. 惯性坐标系&#xff08; i 系 &#xff09;2. 地心地固坐标系&#xff08; e 系 )3. 导航坐标系&#xff08; n 系&…

Multisim14.0仿真(二十五)高频小信号调谐放大器

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a;

API(十一) 获取openresty编译信息

一 ngx.config 说明&#xff1a; 不常用,了解即可 ngx.config.subsystem 说明&#xff1a; 用的四层还是七层代理 ngx.config.debug 说明&#xff1a; 返回的是boolean类型, openresty rpm安装一般没有 --with-debug编译选项对比&#xff1a; nginx rpm 安装一般携带 --wi…

面试算法13:二维子矩阵的数字之和

题目 输入一个二维矩阵&#xff0c;如何计算给定左上角坐标和右下角坐标的子矩阵的数字之和&#xff1f;对于同一个二维矩阵&#xff0c;计算子矩阵的数字之和的函数可能由于输入不同的坐标而被反复调用多次。例如&#xff0c;输入图2.1中的二维矩阵&#xff0c;以及左上角坐标…

Vue.js路由及Node.js的入门使用---超详细

一&#xff0c;Vue路由 1.1 路由是什么 路由是用来管理应用程序中不同页面之间导航的概念。Vue Router是Vue.js官方提供的路由管理器&#xff0c;它允许我们通过定义路由规则和视图组件来配置路由 1.2 路由给我们带来的好处有哪些&#xff1f; 单页应用&#xff08;Single Pag…

【深度学习实验】前馈神经网络(final):自定义鸢尾花分类前馈神经网络模型并进行训练及评价

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;IrisDataset&#xff09; 2. 构建模型&#xff08;FeedForward&#xff09; a. __init__(初始化) b. forward(前向传播) 3.整合训练、评估…

2023年腾讯云服务器优惠活动整理汇总

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;为了吸引更多的用户&#xff0c;腾讯云经常会推出各种各样的优惠活动。本文将为大家整理汇总一些腾讯云服务器的优惠活动&#xff0c;希望能够帮助到需要购买腾讯云服务器的用户。 一、腾讯云服务器优惠券 腾讯云优惠券是腾讯…

瑞云介绍使用ZBrush和Marmoset工具包制作的风格化巨怪战斗机

Renderbus瑞云渲染的小编今天给大家介绍下Gianluca Squillace使用 ZBrush 和 Marmoset 工具包制作巨怪战士的一些技巧。这位艺术家还贴心地告诉大家&#xff0c;有些步骤是可以省略跳过的&#xff0c;这样就可以节省时间&#xff0c;帮助我们快速完成角色的创作啦。快速有用的步…

云计算与大数据——Storm配置及运行WordCountTopology(保姆级教程!)

云计算与大数据——Storm配置及运行WordCountTopology&#xff08;保姆级教程&#xff01;&#xff09; 前言 当今世界正处于云计算和大数据的快速发展阶段&#xff0c;而Storm作为一种高效、可靠的实时计算框架&#xff0c;受到了广泛的关注和应用。在这篇文章中&#xff0c…

企业级磁盘阵列存储系统由硬到软全析

企业级磁盘阵列是由一组设备构成的存储系统,主要包括两种类型的设备,分别是控制器和扩展柜,其中控制器只有一台,扩展柜可以没有,也可以有多台。在EMC的Unity中分别称为DPE(Disk Processor Enclosure)和DAE(Disk Array Enclosure),在华为的OceanStor里面称为控制框和硬…

WebGL 切换着色器

目录 前言 如何实现切换着色器 1. 准备用来绘制单色立方体的着色器 2. 准备用来绘制纹理立方体的着色器 3. 调用createProgram&#xff08;&#xff09;函数&#xff0c;利用第1步创建出的着色器&#xff0c;创建着色器程序对象 4. 调用createProgram&#xff08;&…

Java 设计模式——抽象工厂模式

目录 1.概念2.结构3.实现4.优缺点5.使用场景6.模式扩展7.JDK源码解析——Collection.iterator方法 1.概念 &#xff08;1&#xff09;Java 设计模式——工厂方法模式中考虑的是一类产品的生产&#xff0c;如畜牧场只养动物、电视机厂只生产电视机等。这些工厂只生产同种类产品…

【kubernetes】【基础资源使用】kubernetes中的Deployment使用

1 Why need Deployment? K8S中Pod是用户管理工作负载的基本单位&#xff0c;Pod通常通过Service进行暴露&#xff0c;因此&#xff0c;通常需要管理一组Pod&#xff0c;RC和RS主要就实现了一组Pod的管理工作&#xff0c;其中&#xff0c;RC和RS的区别在于&#xff0c;RS提供更…

【每日一题】528. 按权重随机选择

528. 按权重随机选择 - 力扣&#xff08;LeetCode&#xff09; 给你一个 下标从 0 开始 的正整数数组 w &#xff0c;其中 w[i] 代表第 i 个下标的权重。 请你实现一个函数 pickIndex &#xff0c;它可以 随机地 从范围 [0, w.length - 1] 内&#xff08;含 0 和 w.length - 1&…