自定义数组实现栈的结构。

 package test;

 public class MyArrayStackClient {
public static void main(String[] args) {
ArrayStack<Integer> stack = new ArrayStack<Integer>();
// ArrayStack<Integer> stack=new ArrayStack<Integer>();
// 入栈
stack.push(6);
stack.push(5);
stack.push(4);
stack.push(3);
stack.push(2);
stack.push(1); System.out.println("此时栈是否为空:" + stack.isEmpty());// 判断栈是否为空
System.out.println("获取栈顶元素: " + stack.peek());// 获取栈顶元素
System.out.println("当前栈内元素共有: " + stack.size() + "个");
System.out.println("元素: " + stack.pop() + "出栈");// 元素出栈
System.out.println("当前栈内元素共有: " + stack.size() + "个");
stack.clear();
System.out.println("当前栈内元素共有: " + stack.size() + "个"); }
}
 package test;

 public class ArrayStack<T> implements IStack<T> {
private final int DEFAULT_SIZE = 3;
private int size = 0;
private int capacity = 0; // top指向下一个能够添加元素的位置
private int top = 0;
private Object[] array; public ArrayStack() {
this.capacity = this.DEFAULT_SIZE;
this.array = new Object[this.capacity];// 初始栈
this.size = 0;
} public ArrayStack(int capacity) {
this.capacity = capacity;
this.array = new Object[this.capacity];
this.size = 0;
} // 栈中元素为空
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return size == 0;
} // 获取栈顶元素
@Override
public T peek() {
// TODO Auto-generated method stub
return (T) this.array[this.top - 1];
} @Override
public T pop() {
// TODO Auto-generated method stub
T element = (T) this.array[top - 1];
this.array[top - 1] = null;
this.size--;
return element;
} // 元素入栈
@Override
public void push(T element) {
// TODO Auto-generated method stub
if (this.size < this.capacity) {
this.array[top] = element;
this.top++;
this.size++;
} else {
// System.out.println("out of array");
enlarge(); // 扩大栈的容量
push(element);
}
} // 扩大栈的容量
public void enlarge() {
this.capacity = this.capacity + this.DEFAULT_SIZE;
Object[] newArray = new Object[this.capacity];
// System.arraycopy(array, 0, newArray, 0, array.length);
arrayCopy(array, newArray);
fillArray(array, null); // 用null将array填满
this.array = newArray;
} // 复制元素
public void arrayCopy(Object[] array, Object[] newArray) {
for (int i = 0; i < array.length; i++) {
newArray[i] = array[i];
}
} // 向数组中装填元素
public void fillArray(Object[] array, Object val) {
for (int i = 0; i < array.length; i++) {
array[i] = val;
}
} // 求出此时栈中元素的大小
public int size() {
return this.size;
} // 清空栈
@Override
public void clear() {
// TODO Auto-generated method stub
fillArray(array, null);
this.top = 0;
this.size = 0;
this.capacity = this.DEFAULT_SIZE;
this.array = new Object[this.capacity];
}
}
 package test;

 public interface IStack<T> {
// 元素出栈,并返回出栈元素
public T pop(); // 元素入栈
public void push(T element); // 获取栈顶元素
public T peek(); // 判断栈是否为空
public boolean isEmpty(); // 清栈
public void clear();
}

输出结果如下:

 此时栈是否为空:false
获取栈顶元素: 1
当前栈内元素共有: 6个
元素: 1出栈
当前栈内元素共有: 5个
当前栈内元素共有: 0个

数组实现栈的结构(java)的更多相关文章

  1. 数组、栈、堆(java基础知识五)

    1.数组概述.定义格式 * A:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. * B:数组定义格式 格式1:数据类型[ ...

  2. 算法入门 - 基于动态数组的栈和队列(Java版本)

    之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...

  3. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  4. JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想

    JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...

  5. 深入理解java虚拟机(十) Java 虚拟机运行时栈帧结构

    运行时栈帧结构 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素.每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程. 每一个栈帧在编 ...

  6. 栈的数组和链表实现(Java实现)

    我以前用JavaScript写过栈和队列,这里初学Java,于是想来实现栈,基于数组和链表. 下面上代码: import java.io.*; //用接口来存放需要的所有操作 interface st ...

  7. 详细解析Java虚拟机的栈帧结构

    欢迎关注微信公众号:万猫学社,每周一分享Java技术干货. 什么是栈帧? 正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器.虚拟机栈.本地方法栈.堆和方法区.(什么?你还不知道,赶紧去看看 ...

  8. Java连载69-接受输入、用数组模拟栈

    一.编写一个酒店管理系统 1.直接上代码 package com.bjpowernode.java_learning; ​ public class D69_1_ { //编写一个程序模拟酒店的管理系 ...

  9. java中的栈(利用数组实现栈)

    java中的栈(利用数组实现栈) 常见的数据结构:https://blog.csdn.net/weixin_43304253/article/details/119764275 栈的介绍 1.栈的英文 ...

随机推荐

  1. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...

  2. GitHub上史上最全的Android开源项目分类汇总

    今天在看博客的时候,无意中发现了 @Trinea 在GitHub上的一个项目 Android开源项目分类汇总 ,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫 ...

  3. linux下的缓存机制及清理buffer/cache/swap的方法梳理

    (1)缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接 ...

  4. Android 界面排版的5种方式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对 ...

  5. iOS宏定义

    1.__OBJC__宏定义作用 在.pch 文件中一般都会自动加上这句宏定义,表示宏内引用的文件确保只被使用Objective-C语言的文件所引用,保证引用关系的清晰.因为在一个OC工程中,可能包含. ...

  6. 使用grunt打包前端代码

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...

  7. C# 改变无边框窗体的尺寸大小

    以下代码为修改窗体尺寸的代码: const int HTLEFT = 10; ; ; ; ; ; const int HTBOTTOMLEFT = 0x10; ; protected override ...

  8. LUA GC 简单测试

    function table.count(t) if type(t) ~= "table" then assert(false) return end for k, _ in pa ...

  9. SRTM数据介绍与说明

    一.SRTM 的背景引言 美国利用航天飞机搭载成像雷达对地进行观测始于20 世纪80 年代初.1982 年11 月和1985 年10 月, 美国分别进行了两次称为S IR2A 与S IR2B 的航天飞 ...

  10. 在opencv3中实现机器学习之:利用逻辑斯谛回归(logistic regression)分类

    logistic regression,注意这个单词logistic ,并不是逻辑(logic)的意思,音译过来应该是逻辑斯谛回归,或者直接叫logistic回归,并不是什么逻辑回归.大部分人都叫成逻 ...