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

 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. RecyclerView (一) 基础知识

    RecyclerView是什么? RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.它被作为ListView和GridView控件的继承者,在最新的suppor ...

  2. Android Studio系列教程三--快捷键

    Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...

  3. Android service ( 二) 远程服务

    通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service.在android平台中,一个进程通常不能访问其他进程中的内存 ...

  4. windows客户机连接gerrit的一个报错处理

    gerrit环境部署在linux服务器,windos客户机连接gerrit进行代码操作: 在windows客户机下载Git客户端 在“Git Bash”里使用 ”ssh-keygen -t rsa - ...

  5. Mac 使用SSH远程登录

    一.打开ssh Mac Terminal是自带SSH的,可以用whereis来看看: $ whereis ssh 但是在现有进程中找不到ssh对应的进程: $ ps aux | grep ssh ap ...

  6. js 与ios 交互的三种方法

    第一种:IOS拦截url  实现跳转 参考链接:http://www.cnblogs.com/pengyingh/articles/2354381.html IOS9.0 及以上支持 第二种:IOS ...

  7. Discuz! X的CSS加载机制

    首先,每个页面都会加载以下两个css,data/cache/style_1_common.css和data/cache/style_1_forum_index.css.先讲讲这两个文件名的命名规则:第 ...

  8. Jdev Run Page 没有反应

    从旧电脑把原有的Jdeveloper完整的拷贝至新电脑,且已完整配置JDEV_USER_HOME,JAVA_HOME等环境变量, Run Page报以下错误. [Starting OC4J using ...

  9. AE 打开各种格式文件

    http://blog.sina.com.cn/s/blog_7a3fc90501016qrg.html /// <summary>/// 打开ShapeFile文件/// </su ...

  10. 消息中间件NetMQ结合Protobuf简介

    概述 对于稍微熟悉这两个优秀的项目来说,每个内容单独介绍都不为过,本文只是简介并探讨如何将两部分内容合并起来,使其在某些场景下更适合.更高效. NetMQ:ZeroMQ的.Net版本,ZeroMQ简单 ...