通过学习自定义栈,了解栈的数据结构。
首先写一个栈的接口,描述其具有的基本功能。Stack.java
然后写一个接口的实现类,这只是其中一种实现方式。ArrayStack.java
最后写一个测试类,测试自定义栈的效果。Test.java
整个栈的实现,借助了 自定义数组 这篇文章的类。Array.java
结构如下:
Stack.java:
package algorithm;
public interface Stack<E> {
/**
* 获取栈中数据的大小
* @return
*/
int getSize();
/**
* 判断栈是否为空
* @return
*/
boolean isEmpty();
/**
* 入栈
* @param e
*/
void push(E e);
/**
* 出栈
* @return
*/
E pop();
/**
* 查看栈顶元素
* @return
*/
E peek();
}
ArrayStack.java:
package algorithm;
public class ArrayStack<E> implements Stack<E> {
private Array<E> array;//维护一个自定义的array数组。
/**
* 无参构造函数,调用array的无参构造函数,默认为10的 初始容量。
*/
public ArrayStack(){
array=new Array<E>();
}
/**
* 带参构造函数,指定初始容量。
* @param capacity
*/
public ArrayStack(int capacity) {
array=new Array<E>(capacity);
}
/**
* 获取栈的大小
*/
@Override
public int getSize() {
return array.getSize();
}
/**
* 判断栈是否为空
*/
@Override
public boolean isEmpty() {
return array.isEmpty();
}
/**
* 入栈
*/
@Override
public void push(E e) {
array.addLast(e);
}
/**
* 出栈
*/
@Override
public E pop() {
return array.removeLast();
}
/**
* 查看栈顶元素
*/
@Override
public E peek() {
return array.get(array.getSize()-1);
}
/**
* 重写Object的toString方法
*/
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("Stack:[");
for(int i=0;i<array.getSize();i++) {
sb.append(array.get(i));
if(i!=array.getSize()-1) {
sb.append(",");
}
}
sb.append("] top");//表明最后是栈顶。
return sb.toString();
}
/**
* 自有的方法,获取栈的总容量。
* @return
*/
public int getCapacity() {
return array.getCapacity();
}
}
Test.java:
package algorithm;
public class Test {
public static void main(String[] args) {
Stack<Integer> stack=new ArrayStack<Integer>();
for(int i=0;i<5;i++) {
stack.push(i);
System.out.println(stack);
}
stack.pop();
System.out.println(stack);
}
}
控制台输出: