java使用泛型实现栈结构示例分享


在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`数组来存储栈中的元素,并通过泛型``来保持类型安全。然而,这种实现方式在强制类型转换`(T) stackArray[top--]`时可能会遇到`ClassCastException`,如果栈中存储了不同类型的对象。在实际应用中,通常我们会尽量确保栈中存储的元素类型一致,以避免这种类型转换问题。

此外,为了简化示例,这里并没有实现动态扩容的功能,即栈的大小在创建时就已确定。如果需要动态扩容,可以在`push`方法中检查栈是否已满,如果已满则创建一个更大的数组来替换当前的`stackArray`,并复制旧数组的元素到新数组中。