RT,用Java语言实现了一个栈
栈通过数组实现,提供入栈、出栈和返回栈容量及栈中元素个数四个方法
package com.zhangqi.effective.java;
import java.util.Arrays;
/**
* 定义Stack类实体
* @author zhangqi
*
*/
public class Stack {
// 通过数组来实现stack
private Object[] elements;
// 当前栈中实物数量
private int size = 0;
// stack 默认初始容量大小为16
private static final int DEFAULT_INITIAL_CAPACITY = 16;
// 默认构造方法,初始化栈容量大小
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
/**
* 入栈
* @param o 入栈元素
*/
public void push(Object o) {
ensureCapacity();
// 将元素压入栈底
elements[size++] = o;
}
/**
* 出栈
* @return 出栈元素
*/
public Object pop() {
if (size == 0) {
throw new NullPointerException();
}
// 返回栈顶元素
return elements[--size];
}
/**
* 获取栈容量
* @return 栈容量大小
*/
public int getStackCapacity() {
return elements.length;
}
/**
* 确保栈容量可用
*/
private void ensureCapacity() {
// 如果栈中元素数量与数组长度相等,即栈已满
if (elements.length == size) {
// 复制数据,使栈容量翻倍
elements = Arrays.copyOf(elements, 2*size);
}
}
public static void main(String[] args) {
Stack stack = new Stack();
Stu stu;
for (int i=0; i<16; i++) {
stu = new Stu(String.valueOf(i));
stack.push(stu);
}
System.out.println(stack.getStackCapacity());
// 测试栈容量翻倍
stu = new Stu(String.valueOf(16));
stack.push(stu);
System.out.println(stack.getStackCapacity());
stu = (Stu) stack.pop();
System.out.println(stu);
for (int i = 15; i >= 0; i--) {
stack.pop();
}
System.out.println(stack.size);
// 测试出栈时空指针情况
stack.pop();
}
}
class Stu{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Stu(String name) {
this.name = name;
}
public String toString() {
return name;
}
}