栈的应用:

  undo操作-编辑器

  系统调用栈-操作系统

  括号匹配-编译器

以下是动态数组实现的数组栈:

定义动态数组:

package Date_pacage;

public class Array<E> {
//叫它静态数组
//private int[] data;
private E[] data;
private int size;
//构造函数
public Array(int capacity) {
data = (E[])new Object[capacity];
size = 0;
}
//无参数的构造函数,默认数组的容量为10
public Array() {
this(10);
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public int getCapacity() {
return data.length;
}
// O(1)
public void addLast(E e) {
add(size, e);
}
// O(n)
public void addFirst(E e) {
add(0, e);
}
// O(n/2) = O(n)
public void add(int index, E e) {
if(size>=data.length)
resize(2 *data.length);
if(index<0 || index>size)
throw new IllegalArgumentException("Add failed.index is error.");
for(int i=size-1;i>=index;i--) {
data[i+1] = data[i];
}
data[index] = e;
size++;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
res.append("[");
for(int i = 0 ; i<size ; i++) {
res.append(data[i]);
if(i != size - 1)
res.append(", ");
}
res.append("]");
return res.toString();
}
public E get(int index) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
return data[index];
}
public E getFirst() {
return get(size - 1);
}
public E getLast() {
return get(0);
}
void set(int index, E e) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
data[index] = e;
}
public boolean contains(E e) {
for(int i = 0; i < size; i++) {
if(data[i].equals(e))
return true;
}
return false;
}
public int find(E e) {
for(int i = 0; i < size; i++) {
if(data[i].equals(e))
return i;
}
return -1;
}
public E remove(int index) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
E res = data[index];
for(int i = index; i<size; i++) {
data[i] = data[i+1];
}
size--;
//释放空间,也可以不写
//loitering objects != memory leak
data[size] = null;
if(size == data.length / 4 && data.length / 2 != 0)
resize(data.length / 2);
return res;
}
public E removeFirst() {
return remove(0);
}
public E removeLast() {
return remove(size-1);
}
//只删除了一个e,并不能保证删除了全部e
public void removeElement(E e) {
int index = find(e);
if(index != -1)
remove(index);
}
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for(int i=0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
}

定义Stack接口:

package Date_pacage;

public interface Stack<E> {
int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek();
}

定义ArrayStack:

package Date_pacage;

public class ArrayStack<E> implements Stack<E> {
Array<E> array;
public ArrayStack(int capacity) {
array = new Array<>(capacity);
}
public ArrayStack() {
array = new Array<>();
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
public int getCapacity() {
return array.getCapacity();
}
@Override
public void push(E e) {
array.addLast(e);
}
@Override
public E pop() {
return array.removeLast();
}
@Override
public E peek() {
return array.getLast();
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("STACK:");
res.append("[");
for(int i = 0 ; i < array.getSize() ; i++) {
res.append(array.get(i));
if(i != array.getSize()-1)
res.append(", ");
}
res.append("] top");
return res.toString();
}
}

java——数组栈 ArrayStack的更多相关文章

  1. Java实现栈(链表和线性表两种方法实现)

    一.栈的介绍 任何数据结构都是一种规则 栈就是在最基础的结构--线性结构和链式结构上面定义规则形成的 如果对基本数据结构(线性表和链表)有疑问的同学可以看我之前的博客:https://www.cnbl ...

  2. Java数组你知多少?

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

  3. Java数组的内存管理

    Java数组的内存管理 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才能使用.所谓初始化,就是当数组对象的元 ...

  4. java数组学习

    1. java数组的静态特性:          java是静态语言,java中数组的长度是固定的.还有,数组元素的类型也是在定义时指定了的. 2. java数组里的关键词:          数组变 ...

  5. Java基础学习-Random类和Java数组

    1.随机数类(Random) package com.denniscui;   import java.util.Random; /*  * Random:用于产生随机数  *  * 使用步骤:  * ...

  6. 有关JVM处理Java数组方法的思考

    在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了本文作者的一番思考.本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法. 作者:jarfie ...

  7. Java - 数组解析

    java提高篇(十八)-----数组之一:认识JAVA数组 一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸 ...

  8. java数组声明和变式--record1

    ​ java声明数组方式: String[] namelist; int numlist[];//此声明为动态声明,不能指定长度,numlist[10] 静态声明的方式: int a[]={1,2,3 ...

  9. Java数组的基本讲解

    由于Java数组涵盖的内容比较多,这里从个人的角度对主要的内容进行相关的讲解. 如有不足,欢迎批评指正~ 1)Java数组是动态还是静态的啊?     Java语言是典型的静态语言,由此推断Java数 ...

随机推荐

  1. Mat类的输出格式

    从前面的例程中, 可以看到 Mat 类重载了<<操作符, 可以方便得使用流操作来输出矩阵的内容.默认情况下输出的格式是类似 Matlab 中矩阵的输出格式.除了默认格式,Mat 也支持其他 ...

  2. AbstractBootstrap的研读

    AbstractBootstrap是一个工具类,用来配置和启动Channel的,下面看下AbstractBootstrap的类继承,ServerBootstrap用于启动ServerChannel的, ...

  3. WebGoat系列实验Authentication Flaws

    WebGoat系列实验Authentication Flaws Forgot Password Web应用经常给用户提供取回密码的功能,但是许多应用的实现策略实现的很差,用于验证用户的信息非常简单. ...

  4. Android二维码扫描功能的集成开发

    二维码开发主要依赖ZXing开源项目 项目地址:https://github.com/zxing/zxing 这个开源项目可以扫描一维,和二维码, 一维码指的是书后面的条形码 首先配置ZXing库和A ...

  5. const char *p; char const *p; char * const p的区别

    请看下面三种定义: const char *p; char const *p; char * const p; 首先看第一种,我们先看p,本着”从里往外”的原则,p是一个char *类型的变量,但ch ...

  6. CSS+DIV网页样式布局实战从入门到精通 中文pdf扫描版

    CSS+DIV网页样式布局实战从入门到精通通过精选案例引导读者深入学习,系统地介绍了利用CSS和DIV进行网页样式布局的相关知识和操作方法. 全书共21章.第1-5章主要介绍网页样式布局的基础知识,包 ...

  7. winform GDI基础(四)简单截屏

    Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); G ...

  8. 【C#】ORM框架

    ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁. Java典型的ORM框架有个:Hibernate,my ...

  9. 【bzoj3209】: 花神的数论题 数论-DP

    [bzoj3209]: 花神的数论题 首先二进制数中1的个数最多就是64个 设所有<=n的数里二进制中1的个数为i的有a[i]个 那么答案就是  然后快速幂 求a[i]可以用DP 设在二进制中从 ...

  10. Ready api groovy script 参数化

    def token_type =context.expand ('${#Project#token_type}') def access_token = context.expand('${#Proj ...