栈的抽象类型描述(ADT):
package org.zp.datastruct;
public interface Stack {
// Stack values are stacks whose elements are arbitrary objects.
// 栈元素类型为任意对象
//Modifiers 修改器--修改栈
public void clear();
public void push(Object obj);
public Object pop(); // 删除并返回栈顶元素
//Accessors 访问器--获取栈信息
public boolean isEmpty();
public int size();
public Object peek(); // 返回栈顶元素
}
栈的数组实现:
package org.zp.datastruct;
// 数组实现栈
public class ArrayStack implements Stack {
private static final int DEFAULT_SIZE = 10; // 指定--默认栈深度
private Object[] array;
private int top; // 指向栈顶指针/游标
// public ArrayStack(){}
public ArrayStack() { // 初始化
array = new Object[DEFAULT_SIZE];
top = 0;
}
@Override
public void clear() {
for(int i = 0; i < top; i++) {
array[i] = null;
}
// for(Object i:array) {
// i = null;
// }
top = 0;
}
@Override
public boolean isEmpty() {
return top == 0;
}
@Override
public Object peek() {
if (top == 0) { // 操作空栈时抛出异常,异常可以自己编写(只要继承Exception)
throw new IllegalStateException();
}
return array[top - 1];
}
@Override
public Object pop() {
if (top == 0) {
throw new IllegalStateException();
}
Object obj = array[--top];
array[top] = null;
return obj;
}
@Override
public void push(Object obj) {
if(top == array.length) {
expand();
}
array[top ++] = obj; // 只能向栈顶插入数据
}
@Override
public int size() {
return top;
}
private void expand() { // 辅助方法,数组长度加倍
Object[] newArray = new Object[2*array.length];
for(int i = 0; i < array.length; i++) {
newArray[i] = array[i];
}
array = newArray;
}
public String toString() {
// StringBuilder str = new StringBuilder();
String buf = "[ ";
for (int i = 0; i < top; i++) {
if(i > 0) { // 在每个元素后面加“,”分隔
buf += ", ";
}
buf += array[i];
}
buf += " ]";
return buf;
}
}
测试类:
package org.zp.datastruct;
public class ArrayStackTest {
/**
* @param args
*/
public static void main(String[] args) {
Stack stack = new ArrayStack();
stack.push("Array");
stack.push("Number");
stack.push("String");
stack.push("Object");
System.out.println("栈顶:" + stack.peek().toString());
System.out.println(stack.toString());
// System.out.println("删除栈顶后:" + stack.pop().toString());
// System.out.println(stack.toString());
// stack.clear();
System.out.println(stack.size());
System.out.println(stack.isEmpty());
System.out.println(stack.toString());
}
}