1 概述
栈是一种后进先出的数据结构,本文将使用数组实现一个简单栈结构,功能如下:添加、获取、遍历以及使用泛型存储任何类型。
2 代码实现
package com.niuniu.studyalgorithm;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;
/**
* @author 002991
* 自定义数组栈
*/
public class ResizeArrayStack<Item> implements Iterable<Item>{
/**
* 栈元素
*/
private Item[] items = (Item[])new Object[1];
/**
* 元素数量
*/
private int size = 0;
/**
* 栈是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
}
/**
* 栈元素数量
* @return
*/
public int size(){
return size;
}
/**
* 添加元素
* @param item
*/
public void push(Item item){
if(size == items.length){
resize(2 * items.length);
}
items[size++] = item;
}
/**
* 获取元素
* @return
*/
public Item pop(){
Item item = items[--size];
items[size] = null;
//避免过量冗余空间
if(size > 0 && size == items.length/4){
resize(items.length/2);
}
return item;
}
/**
* 扩容
* @param max
*/
private void resize(int max){
Item[] temp = (Item[]) new Object[max];
for(int i =0; i < size; i++){
temp[i] = items[i];
}
items = temp;
}
@Override
public Iterator<Item> iterator() {
return new ReverseArrayIterator();
}
@Override
public void forEach(Consumer<? super Item> action) {
}
@Override
public Spliterator<Item> spliterator() {
return null;
}
private class ReverseArrayIterator implements Iterator<Item>{
@Override
public boolean hasNext() {
return size > 0;
}
@Override
public Item next() {
return items[size];
}
@Override
public void remove() {
}
@Override
public void forEachRemaining(Consumer<? super Item> action) {
}
}
}
3 总结
3.1 优点
(1)每项操作的用时都与集合大小无关
(2)有效控制栈所占空间的大小
3.2 缺点
某些push和pop操作小调整数组的大小,而调整数组大小的操作与栈大小成正比,有可能造成性能急剧下降。