Java中栈的实现(1)-使用顺序存储结构(数组)以及实现

2023-11-01

栈和队列其实是与普通的线性发展而来的,为普通的线性表增加一些特殊的限制就可以得到栈和队列了。从功能上看,栈和队列比普通的线性表功能相对弱一点,但是在特殊的场合下,使用栈和队列更有利,例如,编译器在实现函数的调用的时候需要使用栈来存储断点,实现递归算法时候也需要用栈来存储。

 

栈:一种数据结构,代表只能从一端进行插入、删除操作的特殊线性表,通常情况下在栈的尾巴进行插入、删除操作。

对于栈而言,允许插入和删除操作的是栈顶(top),另一端是栈底(bottom)。一个栈不包含任何元素的时候是一个空栈。从栈顶插入一个元素是进栈,将一个元素插入栈顶被称为“压入栈”----对应于英文(push)。从栈顶删除一个元素被称为出栈,将一个元素从栈顶删除被称为“弹出栈”----对应于英文(pop).

栈:就是一个后进先出(LIFO)线性表。

注意:栈是一个被限制的线性表,不提供从中间任何位置删除、插入、访问元素的方法。也就是说栈只能够在栈顶插入和删除元素。

栈来自与线性表,因此栈可以使用顺序表的方式来实现也可以使用链表的方式来实现。

本文是根据顺序表来实现栈的使用的语言是Java,下一篇文章中使用链表来实现栈

package com.wpl.stackimpl;

import java.util.Arrays;

public class StackImplByArray {
	
	private int DEFAULT_SIZE=10;
	//保存数组的长度
	private int capacity;
	//定义当数组容量不够的时候,每次增加多少
	private int capacityIncrement=0;
	//定义一个数组来保存栈的元素
	private Object[] elementData;
	//保存数序数组中个数
	private int size=0;
	//一个构造函数
	public StackImplByArray(){
		capacity=DEFAULT_SIZE;
		elementData=new Object[capacity];
		
	}
	
	//获取栈的大小
	public int getLength()
	{
		return size;
	}
	
	//入栈
	public void push(Object element){
		
		//可能要考虑到数组的大小是否合适
		elementData=arrayIsFull();
		elementData[size]=element;
		size++;
		
	}
	
	//出栈
	public Object pop(){
		if(size==0)
		{
			throw new NullPointerException("栈为空!");
		}
		
		Object popElement=elementData[size-1];
		elementData[size-1]=null;
		size=size-1;
		return popElement;
		
	}
	
	//来确定看看是否需要添加数组的大小
	//这种方法效率很低,而且很是麻烦哈
	public Object[] arrayIsFull()
	{
		
		//查看是否要吧数组的容积扩大的条件
		if(elementData.length<=size)
		{
			System.out.println("进来!");
			//每次递增的就是数组长度的一半
			capacityIncrement=elementData.length/2;
			capacity=elementData.length+capacityIncrement;			
			Object []tempArray=new Object[capacity];
			//注意使用copyOf的这个函数哈,参数不要使用有误哈!
			tempArray=Arrays.copyOf(elementData, capacity);
			elementData=new Object[capacity];
			elementData=tempArray;
			return elementData;
			
		}else{
			return elementData;
		}
		
		
	}
	
	
	public static void main(String[] args) {
		
		StackImplByArray test=new StackImplByArray();
		test.push(123);
		test.push("wang");
		test.push("test1");
		test.push("test2");
		test.push("test3");
		test.push("test4");
		test.push("test5");
		test.push("test6");
		test.push("test7");
		test.push("test8");
		test.push("test9");
		test.push("test10");
		test.push("test11");
		
		System.out.println(test.pop());
		System.out.println(test.pop());
		System.out.println(test.pop());		
		System.out.println(test.pop());
		
	}
}

上面的代码调试可以通过,希望大家看看,对大家对于栈的理解可以有点帮助。如果还有不是很明白的,可以多看看栈的实现原理,画画图,自己实际的写写代码。希望对大家都有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中栈的实现(1)-使用顺序存储结构(数组)以及实现 的相关文章

  • 南京大学《软件分析》笔记01 - 静态分析的基本概念

    Rice s Theorem Any non trivial property of the behavior of programs in a r e language is undecidable r e recursively enu
  • 顺序表初始化

    文章目录 1 顺序表 2 顺序表的初始化 1 顺序表 顺序表 顺序存储结构 存储数据时 会提前申请一整块足够大小的物理空间 然后将数据依次存储到一整块连续的存储空间内 存储时做到数据元素之间不留一丝缝隙 使用顺序表存储集合 1 2 3 4
  • Cheat Engine 教程( 1 - 9 通关 )

    工具包 https down 52pojie cn Tools Debuggers Cheat Engine 官网 https www cheatengine org Cheat Engine v7 5 汉化 https pan aoe t
  • FPGA project : inf_rcv

    module top input wire sys clk input wire sys rst n input wire inf in output wire led output wire ds output wire oe outpu

随机推荐

  • 获取数组的所有子序列

    一个包含n个元素的集合 获取其所有子集 可以采用按位对应法 例如 int array 1 3 2 5 这个集合可以看做1325四位 每一位在子集中要么存在要么不存在 是否的操作我们就考虑二进制的01 一位子序列的情况有 1000 0100
  • 大数据的分布式SQL查询引擎 -- Presto的详细使用

    Presto Distributed SQL Query Engine for Big Data 官网 项目源码 官方文档 目录 1 Presto 概述 2 概念 2 1 服务进程 2 2 数据源 2 3 查询执行模型 3 整体架构 4 P
  • 2.4 【LaTex】数论符号

    文章目录 同余 向下取整 向上取整 整除 进制 对数 数论的文章 写的人是蛮少的 因为数论好像已经成为民科专用数学 因为数论门槛低 上限高 研究成本低 很多问题至今未解决 所以成为了民科首选 在这篇文章 我不可能介绍所有数论使用的符号 所以
  • 查看gcc/g++默认include路径

    转自 http gcc gnu org ml gcc help 2007 09 msg00205 html gcc print prog name cc1plus v g print prog name cc1plus v 例如 CentO
  • 新安装Android Studio创建项目失败解决方法

    一 梗概 第一次安装Android Studio的时候 因为被墙等原因 Gradle总是出错导一直构建不了项目 Failed to open zip file Gradle s dependency cache may be corrupt
  • Delphi / C ++ Builder / Lazarus报表开发:如何直接从代码中保存BPM / JPEG / TIFF / GIF?

    报表生成器FastReport VCL是用于在软件中集成商务智能的现代解决方案 它提供了可视化模板设计器 可以访问最受欢迎的数据源 报告引擎 预览 将过滤器导出为30多种格式 并可以部署到云 Web 电子邮件和打印中 近日 FastRepo
  • Hexo + GitHub 搭建个人博客(三) Hexo配置

    Hexo 博客配置 你可以 在根目录下 config yml 中 修改大部分的配置 网站 参数 描述 title 网站标题 subtitle 网站副标题 description 网站描述 keywords 网站的关键词 支持多个关键词 au
  • TCP/UDP/Socket 通俗讲解

    1 封包和拆包 封包 就是发送数据前把自己本地需要发送的数据包装一下 即把要发送的原始数据附加上接受者可以辨识到自己身份等一些额外信息 有点像寄一封信 信封上填写的寄件人和收件人以及地址 拆包 是接收到对方封包后发送来的数据后 拆出原始信息
  • c++基础2:使用VS2010 创建最简单的MFC应用程序窗体

    1 添加 新建项目 选择 VISUAL C MFC应用程序 确定 下一步 2 在 应用程序类型 中选择 基于对话框 下一步 3 在 用户界面功能 只选择 粗框架 下一步 4 在 高级功能 取消所有选择 下一步 5 生成的类 点击 完成
  • 用Cmake生成opencv_contrib的python接口

    最近在看opencv的Fisherface Eigenface的部分 但具体实现时发现该库包含在opencv的contrib模块里 这个模块是opencv的扩展库 里面包括很多特征的算法 SIFT SURF Adaboost算法 ml还有神
  • Ubuntu 下命令行创建(删除)文件(夹)

    很多时候我们都会在终端进行文件 文件夹的创建与删除 使用快捷键ctrl alt t 打开终端 创建文件 touch a txt 创建文件夹 mkdir NewFolder 删除文件 rm a txt 删除文件夹 rmdir NewFolde
  • php 格式化 字符串

    private function setStringSubstr str len sublen len string strip tags str string preg replace n is string string preg re
  • CentOS使用 wget 命令报错Temporary failure in name resolution 解决方法

    在CentOS中安装Redis时使用wget下载一个文件出现了如下问题 wget http download redis io releases redis 3 0 7 tar gz failed Temporary failure in
  • 煤矿智能化相关50项团体标准征求意见

    智能化煤矿总体架构 原文地址 https chinacs scimall org cn a3651 html 由煤矿智能化创新联盟等单位提出 中国煤炭学会归口 中煤科工集团常州研究院有限公司等单位起草的 煤矿通信接口与协议通用技术要求 50
  • java中序列化与反序列化_Java中的序列化示例

    java中序列化与反序列化 Serialization in Java is the process of converting an object into bytes stream to save it in file Or we ca
  • 图:最小生成树

    一 最小生成树 1 1 生成树的定义 一个连通图的生成树是 个极小的连通子图 它包含图中全部的n个顶点 但只有构成 棵树的n 1条边 连通图和它相对应的 成树 可以 于解决实际生活中的问题 假设A B C 和 D 为 4 座城市 为了 便
  • window服务器上发布net项目,在windows服务器上使用winsw部署spring boot项目

    简介 springboot项目需要在windows上部署 spring官方推荐使用winsw来将springboot项目作为服务运行 参考 安装使用 winsw的使用比较简单 从github上下载 winsw下载 要下载的文件有两个 1 w
  • 《Kotlin从小白到大牛》第22章:Kotlin I/O与文件管理

    第22章 Kotlin I O与文件管理 Kotlin I O 输入与输出 是基于Java I O流技术 但是Java I O流技术使用起来比较繁琐 Kotlin提供了很多扩展 使代码变得简洁 本章介绍Kotlin I O流和文件管理相关知
  • 使用jstack排查线上故障:高CPU占用

    1 前言 一个应用占用CPU很高 除了确实是计算密集型应用之外 通常原因都是出现了死循环 我们以当时出现的实际故障为例 来介绍怎么定位和解决这类问题 2 排查步骤 思路 找出tomcat 进程中使用CPU最高 时间最长的线程 分析堆栈信息
  • Java中栈的实现(1)-使用顺序存储结构(数组)以及实现

    栈和队列其实是与普通的线性发展而来的 为普通的线性表增加一些特殊的限制就可以得到栈和队列了 从功能上看 栈和队列比普通的线性表功能相对弱一点 但是在特殊的场合下 使用栈和队列更有利 例如 编译器在实现函数的调用的时候需要使用栈来存储断点 实