本程序定义了一个泛型栈,可对不同的对象元素进行相同的入栈、出栈、获取栈顶元素、输出栈操作。
package pack2; public class GenericStack{ private Object[] obj; //栈数组 private int size; //栈的实际大小 private int DEFAULT_CAPACITY = 16; //栈的默认容量 public GenericStack() { //创建一个具有默认容量的栈 super(); obj = new Object[DEFAULT_CAPACITY]; } public GenericStack(int capacity) { //创建一个具有正整数容量的栈 super(); if(capacity < 0) { System.out.println("The capacity should be greater than zero"); System.exit(1); } obj = new Object[capacity]; } public void push(T o) { //入栈 if(size >= obj.length) { //如果实际大小>=栈数组的长度,数组扩容 Object[] temp = new Object[size + (int)(size * 1.5)]; //创建一个|原实际大小+原实际大小一半|的数组 System.arraycopy(obj, 0, temp, 0, size); //调用方法进行数组内容复制 obj = temp; //temp数组的引用赋给obj } obj[size++] = o; } @SuppressWarnings("unchecked") public T pop() { //出栈 if(isEmptyStack()) { //判断是否栈空 System.out.println("This is an empty stack, so cannot pop"); System.exit(2); } return (T)obj[--size]; //--size 先自减在调用 } @SuppressWarnings("unchecked") public T peak() { //获取栈顶元素 if(isEmptyStack()) { System.out.println("This is an empty stack, so cannot peak"); System.exit(3); } return (T)obj[size-1]; //size-1 为数组中栈顶元素的下标 } public boolean isEmptyStack() { //返回栈是否空的布尔值 return size == 0; } public void printStack() { //输出栈(后进先出) for (int i = size-1; i >= 0; i--) System.out.print(obj[i]+" "); System.out.println(); } public int getSize() { //返回栈的实际大小 return size; } }
测试程序如下:
package pack2;
public class TestGenericStack {
public static void main(String[] args) {
GenericStack stack1 = new GenericStack<>();
stack1.push("Name");
stack1.push("China");
stack1.push("America");
stack1.push("Japanese");
System.out.print("The data of stack1 is ");
stack1.printStack();
System.out.println("The size of stack1 is "+stack1.getSize());
stack1.pop();
System.out.print("After pop, the new data of stack1 is ");
stack1.printStack();
System.out.println("After pop, the new size of stack1 is "+stack1.getSize());
GenericStack stack2 = new GenericStack<>(10);
for (int i = 0; i < 20; i++) {
stack2.push(i);
}
System.out.print("nThe data of stack2 is ");
stack2.printStack();
System.out.println("The size of stack2 is "+stack2.getSize());
for (int i = 0; i < 20; i++) {
stack2.pop();
}
System.out.println("After pop, the new size of stack2 is "+stack2.getSize());
stack2.pop();
}
}



