数组实现栈的结构(java)
自定义数组实现栈的结构。
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)的更多相关文章
- 数组、栈、堆(java基础知识五)
1.数组概述.定义格式 * A:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. * B:数组定义格式 格式1:数据类型[ ...
- 算法入门 - 基于动态数组的栈和队列(Java版本)
之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...
- Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)
Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...
- JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想
JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...
- 深入理解java虚拟机(十) Java 虚拟机运行时栈帧结构
运行时栈帧结构 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素.每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程. 每一个栈帧在编 ...
- 栈的数组和链表实现(Java实现)
我以前用JavaScript写过栈和队列,这里初学Java,于是想来实现栈,基于数组和链表. 下面上代码: import java.io.*; //用接口来存放需要的所有操作 interface st ...
- 详细解析Java虚拟机的栈帧结构
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货. 什么是栈帧? 正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器.虚拟机栈.本地方法栈.堆和方法区.(什么?你还不知道,赶紧去看看 ...
- Java连载69-接受输入、用数组模拟栈
一.编写一个酒店管理系统 1.直接上代码 package com.bjpowernode.java_learning; public class D69_1_ { //编写一个程序模拟酒店的管理系 ...
- java中的栈(利用数组实现栈)
java中的栈(利用数组实现栈) 常见的数据结构:https://blog.csdn.net/weixin_43304253/article/details/119764275 栈的介绍 1.栈的英文 ...
随机推荐
- 大话redis/memcache缓存
通常情况下,随着业务量增加,对后端数据库的访问压力也会随之加大.当数据库访问压力渐渐增大时,除了升级数据库配置提高数据库本身的抗压能力外,我们也可以采用在应用服务器与数据库服务器之间架设数据库缓存服务 ...
- AFN框架基本使用
0.AFN框架基本使用 0.1 AFN内部结构 AFN结构体 - NSURLConnection + AFURLConnectionOperation(已经被废弃) + AFHTTPRequestOp ...
- 027医疗项目-模块二:药品目录的导入导出-导入功能的Action的编写
前一篇文章我们写了Service层,这篇文章我们写一下Action层. 实现的功能: 1:我们先下载模板:然后按照模板里面的规则,插入数据.比如存在d盘. 2:然后浏览找到那个文件,上传上去. 然后把 ...
- RDLC系列之三 图片显示
一.头像效果
- jqXHR 对象(post完成后再调用函数)
场景: function A() { B(); C(); } function B() { $.post(url, {}, function () { alert("我错了!"); ...
- 【转】【C#】C#重绘windows窗体标题栏和边框
摘要 windows桌面应用程序都有标准的标题栏和边框,大部分程序也默认使用这些样式,一些对视觉效果要求较高的程序,如QQ, MSN,迅雷等聊天工具的样式则与传统的windows程序大不相同,其中迅雷 ...
- C#不同窗体间通信,数据传递
在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...
- 为什么需要DTO(数据传输对象)
DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来绑定表现层中的数据,为什么不能直接用实体模型呢,有了DTO同时还要维护DTO与Model之间的映射关系,多麻烦. 然后看了这篇文章中的 ...
- 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站
首先得有一个注册的appkey和App Secret 该流程分三个步骤: 第一步:通过用户授权获取授权码Code: 第二步:用上一步获取的Code和应用密钥(AppSecret)通过Https P ...
- 2015年新版C#从入门到精通(第2版)视频教学录像【无水印版】
<c#从入门到精通(第2版)>以零基础讲解为宗旨,用实例引导读者学习,深入浅出地介绍了c#的相关知识和实战技能.<c#从入门到精通(第2版)>第1篇[c#语言基础]主要讲解c# ...