首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果堆栈为空,则重写stack.peek()以返回null

基础概念

堆栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,它允许元素在一个端点(称为栈顶)进行插入和删除操作。peek() 方法用于查看栈顶的元素而不移除它。

相关优势

  • 简单性:堆栈的实现非常简单,只需要一个数组或链表来存储数据,并维护一个指向栈顶的指针。
  • 高效性:插入和删除操作的时间复杂度均为 O(1),非常适合需要快速访问最近添加的元素的场景。

类型

  • 数组实现:使用数组来存储堆栈元素,通过调整数组索引来模拟栈顶。
  • 链表实现:使用链表来存储堆栈元素,链表的头部即为栈顶。

应用场景

  • 函数调用栈:在程序执行过程中,每个函数的调用都会在堆栈上创建一个新的栈帧,用于存储局部变量和返回地址。
  • 括号匹配:用于检查表达式中的括号是否匹配。
  • 深度优先搜索:在图和树的遍历中,深度优先搜索算法通常使用堆栈来实现。

问题描述

如果堆栈为空,调用 stack.peek() 方法时可能会抛出异常。为了避免这种情况,我们需要重写 peek() 方法,使其在堆栈为空时返回 null

解决方案

以下是使用 Java 语言实现的堆栈类,其中重写了 peek() 方法:

代码语言:txt
复制
import java.util.EmptyStackException;

public class CustomStack<T> {
    private Object[] elements;
    private int size;
    private static final int DEFAULT_CAPACITY = 10;

    public CustomStack() {
        this(DEFAULT_CAPACITY);
    }

    public CustomStack(int capacity) {
        elements = new Object[capacity];
        size = 0;
    }

    public void push(T item) {
        ensureCapacity();
        elements[size++] = item;
    }

    public T pop() {
        if (isEmpty()) {
            throw new EmptyStackException();
        }
        @SuppressWarnings("unchecked")
        T item = (T) elements[--size];
        elements[size] = null; // 帮助垃圾回收
        return item;
    }

    public T peek() {
        if (isEmpty()) {
            return null;
        }
        @SuppressWarnings("unchecked")
        T item = (T) elements[size - 1];
        return item;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private void ensureCapacity() {
        if (elements.length == size) {
            Object[] newElements = new Object[elements.length * 2];
            System.arraycopy(elements, 0, newElements, 0, size);
            elements = newElements;
        }
    }

    public static void main(String[] args) {
        CustomStack<Integer> stack = new CustomStack<>();
        System.out.println(stack.peek()); // 输出 null
        stack.push(1);
        stack.push(2);
        System.out.println(stack.peek()); // 输出 2
        stack.pop();
        System.out.println(stack.peek()); // 输出 1
        stack.pop();
        System.out.println(stack.peek()); // 输出 null
    }
}

参考链接

通过这种方式,我们可以确保在堆栈为空时,peek() 方法不会抛出异常,而是返回 null,从而提高代码的健壮性和可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 领券