棧的抽象類型描述(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());
}
}