首先定义 IStack

package cn.com.example.stack;

/**
* Created by Jack on 2017/3/8.
*/
public interface IStack<T> { //元素出栈,并返回出栈元素
public T pop() throws IllegalAccessException; //元素入栈
public void push(T element); //获取栈顶元素
public T peek() throws IllegalAccessException; //判断栈是否为空
public boolean isEmpty(); // 栈大小
public int size(); public void clear();
}

接着定义 MyStack 实现 IStack接口  并测试

package cn.com.example.stack;

import java.util.Arrays;

/**
* Created by Jack on 2017/3/8.
*/
public class MyStack<T> implements IStack { private final int DEFAULT_SIZE = 3;
private int size = 0;
private int capacity = 0; //top指向下一个能够添加元素的位置
private int top = 0;
private Object[] array; public MyStack() {
this.capacity = this.DEFAULT_SIZE;
this.array = new Object[this.capacity];
this.size = 0;
} public MyStack(int capacity) {
this.capacity = capacity;
this.array = new Object[this.capacity];
this.size = 0;
} /**
* 元素出栈,并返回出栈元素
*
* @return
*/
@Override
public Object pop() throws IllegalAccessException {
if (this.size == 0)
throw new IllegalAccessException("stack element empty");
T element = (T) this.array[top - 1];
this.array[top - 1] = null;
this.size--;
this.top--;
return element;
} /**
* 元素入栈
*
* @param element
*/
@Override
public void push(Object element) {
if (this.size < this.capacity) {
this.array[this.top] = element;
this.top++;
this.size++;
} else {
// 扩容
enlarge();
push(element);
}
} private void enlarge() {
this.capacity = this.capacity + this.DEFAULT_SIZE;
Object[] newArray = new Object[this.capacity];
System.arraycopy(array, 0, newArray, 0, array.length);
Arrays.fill(array, null);
this.array = newArray;
} /**
* 获取栈顶元素
*
* @return
*/
@Override
public Object peek() throws IllegalAccessException {
if (this.size == 0)
throw new IllegalAccessException("stack element empty");
return this.array[this.top - 1];
} /**
* 判断栈是否为空
*
* @return
*/
@Override
public boolean isEmpty() {
return size == 0;
} /**
* 获取栈大小
*
* @return
*/
@Override
public int size() {
return size;
} /**
* 清空 栈
*/
@Override
public void clear() {
Arrays.fill(array, null);
this.capacity = this.DEFAULT_SIZE;
this.array = new Object[this.capacity];
this.size = 0;
this.top = 0;
}
} class MyStackTest {
public static void main(String[] args) throws IllegalAccessException {
MyStack<String> stack = new MyStack<String>(); stack.push("1"); // 栈头
System.out.println(stack.peek()); // 栈头出栈
System.out.println(stack.pop()); // 是否为空
System.out.println(stack.isEmpty()); System.out.println(stack.size()); for (int i = 1; i <= 10; i++) {
stack.push("" + i);
} System.out.println(stack.size()); for (int i = 0; i < 10; i++) {
String s = (String) stack.pop();
System.out.println(s);
} // 清空
//stack.clear(); System.out.println("size = " + stack.size());
}
}

输出

1
1
true
0
10
10
9
8
7
6
5
4
3
2
1
size = 0

Java 数组实现 stack的更多相关文章

  1. Java数组你知多少?

    下面我带大家一起加深一下对Java数组的认识: 1.理解数组 数组也是一种数据类型,本身就是一种引用类型,我们从它的初始化方法,通过关键字new去完成定义及初始化就可以知道. 数组的长度是不变的,一旦 ...

  2. Java数组操作的10大方法

    转载自码农网 译文链接:http://www.codeceo.com/article/10-java-array-method.html 英文原文:Top 10 Methods for Java Ar ...

  3. Java数组!!!你知多少?

    这是一篇网上搜到的文章,对数组进行了充分的说明.楼主懂了数组的俩种初始化方式:静态初始化和动态初始化方式.(贴过来备用哦) 下面我带大家一起加深一下对Java数组的认识: 1.理解数组 数组也是一种数 ...

  4. Java-杂项:Java数组Array和集合List、Set、Map

    ylbtech-Java-杂项:Java数组Array和集合List.Set.Map 1.返回顶部 1. 之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊 ...

  5. Java数组深入

    Java数组深入 内存中的数组 前边提到:数组是一种引用类型,数组引用变量只是一个引用,当它指向有效内存的时候才可以通过数组变量来访问数组元素,也就是说数组变量和数组元素在内存中是分开放的. 可以这么 ...

  6. 五分钟学Java:打印Java数组最优雅的方式是什么?

    在逛 Stack Overflow 的时候,发现了一些访问量像‎安第斯山一样高的问题,比如说这个:打印 Java 数组最优雅的方式是什么?访问量足足有 220W+,想不到啊,这么简单的问题竟然有这么多 ...

  7. Java 数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...

  8. 第5章 Java数组

    1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...

  9. Java 数组基础

    数组 数组(Array):相同类型数据的集合. 定义数组 方式1(推荐,更能表明数组类型) type[] 变量名 = new type[数组中元素的个数]; 比如: int[] a = new int ...

随机推荐

  1. KKT(Karush-Kuhn-Tucher)条件

    在优化理论中,KKT条件是非线性规划(nonlinear programming)最佳解的必要条件.KKT条件将lagrange乘数法(Lagrange multipliers)中的等式约束优化问题推 ...

  2. PAT A1107 Social Clusters (30 分)——并查集

    When register on a social network, you are always asked to specify your hobbies in order to find som ...

  3. PAT A1013 Battle Over Cities (25 分)——图遍历,联通块个数

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  4. 解决linux下无线网卡被物理禁用问题

    困扰了我好几天终于解决了这个问题,这里写出来,给再遇到这样问题的朋友做个借鉴! 笔记本:lenovo 问题描述:wifi无线网卡开关是打开的,但是安装linux(fedora \ ubuntu )后, ...

  5. JavaScript设计模式 - 订阅发布模式(观察者模式)

    var Event = (function() { var global = this, Event, _default = 'default'; Event = function() { var _ ...

  6. IDEA 创建和使用tomcat

    一.创建一个普通web项目,步骤略,如下图. 二.配置项目相关信息. 1.通过如下方式在Artifacts下添加我们的项目. 2.选中我们的项目. 3.修改项目的默认输出位置,可根据需要修改. 4.如 ...

  7. Luogu4173 残缺的字符串 FFT

    传送门 考虑如何使用FFT计算两个子串是否匹配.如果字符集比较小可以把每个字符都拿出来暴力做一遍,但是字符集比较大的时候复杂度就会有问题.这个时候可以考虑匹配函数. 先考虑没有通配符的情况.将\(A\ ...

  8. Luogu P2522 [HAOI2011]Problem b

    如果你做过[Luogu P3455 POI2007]ZAP-Queries就很好办了,我们发现那一题求的是\(\sum_{i=1}^a\sum_{j=1}^b[\gcd(i,j)=d]\),就是这道题 ...

  9. CF 888E Maximum Subsequence

    一道比较套路的题,看到数据范围就差不多有想法了吧. 题目大意:给一个数列和\(m\),在数列任选若干个数,使得他们的和对\(m\)取模后最大 取膜最大,好像不能DP/贪心/玄学乱搞啊.\(n\le35 ...

  10. STM32 M3内核的位带操作原理及步骤

    STM32 M3内核的位带操作原理及步骤 一.位带操作有什么用?什么是位带操作 位带操作的作用:可以实现对某一GPIO口寄存器(或SRAM内存中)的某一bit位直接写0或1,达到控制GPIO口输出(或 ...