在Java中,使用泛型来实现栈结构可以使得栈能够存储任意类型的对象,同时保持类型安全。以下是一个简单的泛型栈的实现示例:
public class GenericStack<T> {
private Object[] stackArray;
private int top;
private int maxSize;
// 构造函数,初始化栈的大小
@SuppressWarnings("unchecked")
public GenericStack(int maxSize) {
this.maxSize = maxSize;
this.stackArray = new Object[this.maxSize];
this.top = -1;
}
// 检查栈是否已满
public boolean isFull() {
return top == maxSize - 1;
}
// 检查栈是否为空
public boolean isEmpty() {
return top == -1;
}
// 入栈操作
public void push(T item) {
if (isFull()) {
System.out.println("Stack is full");
return;
}
stackArray[++top] = item;
}
// 出栈操作
public T pop() {
if (isEmpty()) {
throw new EmptyStackException();
}
return (T) stackArray[top--];
}
// 查看栈顶元素
public T peek() {
if (isEmpty()) {
throw new EmptyStackException();
}
return (T) stackArray[top];
}
// 空栈异常类
private static class EmptyStackException extends RuntimeException {
public EmptyStackException() {
super("Stack is empty");
}
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
GenericStack<Integer> intStack = new GenericStack<>(5);
// 入栈操作
intStack.push(1);
intStack.push(2);
intStack.push(3);
// 查看栈顶元素
System.out.println("Top element: " + intStack.peek());
// 出栈操作
while (!intStack.isEmpty()) {
System.out.println(intStack.pop());
}
}
}
请注意,上述代码中的`GenericStack`类使用了`Object`数组来存储栈中的元素,并通过泛型`
此外,为了简化示例,这里并没有实现动态扩容的功能,即栈的大小在创建时就已确定。如果需要动态扩容,可以在`push`方法中检查栈是否已满,如果已满则创建一个更大的数组来替换当前的`stackArray`,并复制旧数组的元素到新数组中。