栈及其Java实现

栈及其Java实现

​ 栈(Stack)又名堆栈,是允许在同一端进行插入和删除操作的特殊线性表。其中,允许进行插入和删除操作的一端叫做栈顶(Top),另一端叫做栈底(Bottom),栈底固定,栈顶浮动。在栈中的元素个数为零时,该栈叫做空栈。插入的过程叫做进栈(Push),删除的 过程叫作退栈(Pop)。栈也叫作后进先出(FILO-First In Last Out)的线性表。具体的数据结构图如图所示。
在这里插入图片描述

要实现一个栈,需要先实现如下核心方法。

​ push():向栈中压入一个数据,先入栈的数据在最下边。

​ pop():弹出栈顶数据,即移除栈顶数据。

​ peek():返回当前的栈顶数据。

栈的具体实现过程如下。

(1)定义栈的数据结构:

/**
 * 基于数组实现的顺序栈
 * @param <E>
 */
public class Stack<E> {
    private Object[] data = null;
    private int maxSize = 0; // 栈的最大容量
    private int top = -1; //栈顶的指针
    //构造函数:根据指定的size初始化栈
    Stack() {
        this(10); //默认栈的大小为10
    }
    Stack (int initialSize) {
        if (initialSize >= 10) {
            this.maxSize = initialSize;
            data = new Object[initialSize];
            top = -1;
        } else {
            throw new RuntimeException("初始化大小不能小于0:" + initialSize);
        }
    }
}

​ 以上代码定义了一个Stack类,用于存储栈的数据结构;定义了一个数组data,用于存储栈中的数据;定义了一个变量maxSize,表示栈的最大容量;定义了一个变量top,表示栈顶的指针;定义了两个栈的构造函数,在构造函数没有参数时默认构造一个大小为10的栈。

(2)数据入栈,向栈顶压入一个数据:

    //进栈,第1个元素top=0
    public boolean push(E e) {
        if(top == maxSize - 1) {
            throw new RuntimeException("栈已满,无法将元素入栈!");
        } else {
            data[++top] = e;
            return true;
        }
    }

​ 以上代码定义了push方法来向栈中压入数据,在数据入栈前首先判断栈是否满了,具体的判断依据为栈顶元素的指针位置等于栈的最大容量。注意,这里使用maxSize-1是因为栈顶元素的指针是从0开始计算的。在栈有可用空间时,使用data[++top]=e在栈顶(top位置)上方新压入一个元素并将top加1.

(3)数据出栈,从栈顶移除一个数据:

 //弹出栈顶的元素
    public E pop() {
        if(top == -1) {
            throw new RuntimeException("栈为空!");
        } else {
            return (E)data[top--];
        }
    }

​ 以上代码定义了pop方法来从栈顶移除一个数据,在移除前先判断栈顶是否有数据,如果有,则通过data[top–]将栈顶数据移除并将top减1.

(4)查询数据:

 //查询栈顶元素但不移除
    public E peek() {
        if (top == -1) {
            throw new RuntimeException("栈为空!");
        } else {
            return (E)data[top];
        }
    }

以上代码定义了peek方法来取出栈顶的数据,在取出栈顶的数据前先判断栈顶的元素是否存在,如果存在,则直接返回栈顶的元素,否则抛出异常。

测试样例:

    public static void main(String[] args) {
        Stack<Integer> element = new Stack<Integer>(15);
        for (int i = 0 ; i < 15 ; i++) {
            element.push(i);
        }
        System.out.println(element.pop());
        System.out.println(element.peek());
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常见面试题之计算机网络

1. OSI 五层模型&#xff08;或七层模型&#xff09;是什么&#xff0c;每一层的作用是什么 应用层&#xff1a;又可细分为应用层、表示层、会话层。其中应用层主要做的工作就是为应用程序提供服务&#xff0c;常见的协议为 HTTP、HTTPS、DNS等&#xff1b;表示层主要做的工作…

如何从笔记本电脑恢复已删除的照片

人们相信照片是回忆一生中最难忘事件的最佳媒介。人们在计算机上收集超过 5 GB 的照片是很常见的。然而&#xff0c;在笔记本电脑上保存照片并不安全&#xff0c;因为您可能会因以下原因有意或无意地删除笔记本电脑上的照片&#xff1a; 您的笔记本电脑存储空间几乎已满。您必…

模型、算法、数据模型、模型结构是什么?它们之间有什么关联和区别?

模型、算法、数据模型、模型结构是什么&#xff1f;它们之间有什么关联和区别&#xff1f; 导读一、算法1、算法定义2、机器学习算法定义 二、模型1、模型定义2、数据模型定义3、机器学习模型定义 三、模型结构1、线性模型2、基于实例的模型3、决策树模型4、支持向量机5、集成方…

分析基于解析物理模型的E模式p沟道GaN高电子迁移率晶体管(H-FETs)

来源&#xff1a;Analyzing E-Mode p-Channel GaN H-FETs Using an Analytic Physics-Based Compact Mode&#xff08;TED 24年&#xff09; 摘要 随着近期对用于GaN互补技术集成电路&#xff08;ICs&#xff09;开发的p沟道GaN器件研究兴趣的激增&#xff0c;一套全面的模型…

程序员要失业?全球首位“AI程序员”Deven真的适合职场吗

制造Devin的公司&#xff0c;是一家叫Cognition的10人初创公司&#xff0c;才成立不到2个月。 一、引言 一家成立不到两个月但拥有十名天才工程师的初创公司Cognition&#xff0c;搞了一个引爆科技圈的大动作。 他们推出了一款名为Devin的人工智能&#xff08;AI&#xff09;助…

C语言数据结构易错知识点(3)(堆)

1.堆的本质&#xff1a;完全二叉树 堆在物理结构上是顺序结构&#xff0c;实现方式类似于顺序表&#xff08;数组&#xff09;&#xff1b;但在逻辑结构上是树形结构&#xff0c;准确来说堆是一棵完全二叉树。因为堆的实现在代码上和顺序表有很高的相似度&#xff0c;所以在写…

机试:偶数分解

题目描述: 代码示例: #include <bits/stdc.h> using namespace std; int main(){ // 算法思想1:遍历小于该偶数的所有素数,存入数组中,遍历数组找出两个数之和等于偶数的数int n;cout << "输入样例" << endl;cin >> n;int nums[n];int k …

Android 地图 判断一点是否在某区域内

问题 Android 地图 判断一点是否在某区域内 详细问题 笔者进行Android项目开发&#xff0c;接入高德地图绘制区域后&#xff0c;需要判断一点是否在某区域内&#xff0c;如何实现 代码 mMapView.getMap().addPolygon(polygonOptions).contains(latLng)代码含义解释 这段代…

【C#】【SAP2000】读取SAP2000中frame单元列表到Grasshopper中

private void RunScript(bool build, ref object p1, ref object p2, ref object Profile, ref object stressRatio, ref object temperatureLoad, ref object displacement, ref object frameList){if (build true){// 声明变量int ret;int Numit 0;int[] ObjType new int[…

在Vue中使用wangeditor创建富文本编辑器的完整指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Jmeter+Ant 接口自动化环境配置指南

一 、Jmeter安装与配置 https://blog.csdn.net/tester_sc/article/details/80746405 注&#xff1a;Jmeter5.0的环境变量配置与4.0或历往老版本有部分小差异&#xff0c;笔者用的Jmeter 5.0 二 、Ant的安装与配置 # Ant下载地址(下载到指定目录后&#xff0c;进行解压到当前…

链表详解-leetcode203.移除链表元素

链表 移除链表元素 题目&#xff1a; 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[…

C++中的多值返回:解锁函数返回值的神奇力量

C中的多值返回&#xff1a;解锁函数返回值的神奇力量 在C编程中&#xff0c;有时候我们需要从函数中返回多个值。虽然C中的函数通常只能返回一个值&#xff0c;但有几种技术和惯用法可以实现返回多个值的效果。本文将介绍C中实现多值返回的几种常用方法&#xff0c;包括引用、指…

F5怎么样?保障AI服务的安全性和交付

伴随着人工智能时代的快速发展&#xff0c;AI已成为企业数字化转型的得力工具&#xff0c;比如为用户提供更好的服务&#xff0c;降低企业成本等。与此同时&#xff0c;AI技术的应用也会带来应用安全等方面的新风险&#xff0c;可见其有着双刃剑效应。作为一家提供多云应用安全…

react-面试题

一、组件基础 1. React 事件机制 <div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&#xff0c;React将事…

差分逻辑电平 — LVDS、CML、LVPECL、HCSL互连

前言 首先了解差分逻辑电平、单端逻辑电平的基础知识 地址&#xff1a;常见的逻辑电平_常用的逻辑电平-CSDN博客 注&#xff1a; ECL >> PECL >> LVPECL演变&#xff1b; ECL速度快&#xff0c;驱动能力强&#xff0c;噪声小&#xff0c;但是功耗大&#xff0c;使…

STM32-位带操作及位带别名区

这里写自定义目录标题 一、位带操作的基本含义及作用二、以STM32为例三、位带别名区和位带区(寄存器地址位地址)的转换关系四、使用例程 一、位带操作的基本含义及作用 位带别名区的设计主要是为了**方便对位带区单个比特位进行读写操作**。在某些应用场景下&#xff0c;需要频…

手把手学会pycharm中使用git

学习教程&#xff1a;http://【git pycharm的使用 连接github】 https://www.bilibili.com/video/BV1sv4y1D7SW/?share_sourcecopy_web&vd_source1a32dd27a726236a74603cf06b7302aa 1. 上传到本地仓库 &#xff08;1&#xff09;直接上传本地仓库 &#xff08;2&#xf…

OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT&#xff0c;仅供学习参考。 ​​​​​​​

easyExcel 导入、导出Excel 封装公共的方法

文档包含三部分功能 1、easyExcel 公共导出list<对象>方法&#xff0c;可以自定义excel中第一行和样式 2、easyExcel 导入逻辑&#xff0c;结合spring Validator 验证导入数据是否符合规范 3、easyExcel 自定义导出 list<map> 、 list<对象> &#xff08;可…