首页
学习
活动
专区
工具
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,从而提高代码的健壮性和可读性。

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

相关·内容

  • 【Java数据结构】详解Stack与Queue(二)

    左括号必须以正确的顺序闭合。...返回false。 如果当前字符是右括号,且栈为空,那么就是右括号多,返回false。 如果当前字符是右括号,栈顶元素与当前的右括号字符不匹配,返回false。...3.匹配:( [ ] ) 如果字符是右括号,判断栈顶元素与当前的右括号字符是否匹配,如果匹配就进行出栈操作,直到遍历完整个字符串,且我们的栈为空则返回true。...如果不同,则继续将第一个序列的元素压入栈中,直到找到一个与第二个序列当前元素相同的栈顶元素为止,或者直至循环结束; 最后,如果栈为空,则说明第二个序列是第一个序列的一个合法的弹出顺序,返回true;否则...入栈: 所有元素都要放入普通栈,判断元素是否放入最小栈,如果最小值为空,则直接将元素入最小栈。

    11310

    滚雪球学Java(18):解密JavaSE中的堆栈:你真的了解Java内存吗?

    pop() 方法:出栈操作,即移除并返回栈顶元素。首先检查栈是否为空,即 isEmpty() 方法返回 true,如果为空则抛出 EmptyStackException 异常。...首先检查栈是否为空,即 isEmpty() 方法返回 true,如果为空则抛出 EmptyStackException 异常。否则,返回 array[top - 1]。...创建一个新的节点,将该节点设置为栈顶节点的下一个节点,并将栈顶节点更新为新节点。同时,元素个数加一。pop方法:弹出栈顶元素。如果栈为空,则抛出EmptyStackException异常。...否则,获取栈顶节点的元素,并将栈顶节点更新为其下一个节点。同时,元素个数减一。peek方法:返回栈顶元素,但不弹出。如果栈为空,则抛出EmptyStackException异常。...isEmpty方法:判断栈是否为空。如果栈顶节点为null,则认为栈为空。size方法:返回栈中元素的个数。  这个实现基于链表的栈相比于基于数组的栈,具有动态性,可以根据实际情况调整栈的大小。

    12321

    二维矩阵中的最大矩形面积–java实现

    一、原题: 给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积。...2、分析: 如果采用枚举的方式,如果当前我们枚举项是 i = 0, 即 height = 2时, 我们用另外两个变量 j 和k 向左和向右两个方向搜素,分别找到第一个小于当前height的下标,这样我们就可以算出用...为了不用考虑堆栈为空的情况,我们用插入栈底 一个高度(0, 0)的项。...//新的元素比前一个元素的高度高,则计算当前矩形的面积,并出栈 while(array[i]stack.peek().getHeight()){ Integer area=(...//新的元素比前一个元素的高度高,则计算当前矩形的面积,并出栈 while(array[i]stack.peek().getHeight()){ Integer area=(

    73310

    【Java】10 Deque 接口

    void addLast(E e) 将指定的元素插入此双端队列的末尾 boolean contains(Object o) 如果此双端队列包含指定的元素,则返回 true E element( ) 返回此双端队列的头部...offerFirst(E e) 在此双端队列前面插入指定的元素 boolean offerLast(E e) 在此双端队列末尾插入指定的元素 E peek( ) 返回此双端队列的头部,如果此双端队列为空...,则返回 null E peekFirst( ) 返回此双端队列的第一个元素,如果此双端队列为空,则返回 null E peekLast( ) 返回此双端队列的最后一个元素,如果此双端队列为空,则返回...null E poll( ) 返回并删除此双端队列的头部,如果此双端队列为空,则返回 null E pollFirst( ) 返回并删除此双端队列的第一个元素,如果此双端队列为空,则返回 null E...pollLast( ) 返回并删除此双端队列的最后一个元素,如果此双端队列为空,则返回 null E pop( ) 从此双端队列表示的堆栈中弹出一个元素 void push(E e) 将元素推送到此双端队列表示的堆栈

    50340

    搞定大厂算法面试之leetcode精讲17.栈

    有效的括号 (easy) 方法1.栈 ds_25 思路:首先如果字符串能组成有效的括号,则长度一定是偶数,我们可以遍历字符串,遇到左括号则暂存,期待后面有右括号可以和它匹配,如果遇到右括号则检查是否能和最晚暂存的做括号匹配...所以我们可以准备一个栈存放括号对,遍历字符串的时候,如果遇到左括号入栈,遇到右括号则判断右括号是否能和栈顶元素匹配,在循环结束的时候还要判断栈是否为空,如果不为空,则不是有效括号匹配的字符串 复杂度分析...在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了...最后如果进栈和出栈都为空的话,说明模拟的队列为空了。 复杂度分析:push时间复杂度O(1),pop时间复杂度为O(n) ,因为pop的时候,输出栈为空,则把输入栈所有的元素加入输出栈。...return this.stack2.pop();//不为空则输出栈出栈 } while(this.stack1.length) {//输出栈为空,则把输入栈所有的元素加入输出栈

    33320

    Java数据结构和算法(四)——栈

    允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。   ...这里以羽毛球筒为例,羽毛球筒就是一个栈,刚开始羽毛球筒是空的,也就是空栈,然后我们一个一个放入羽毛球,也就是一个一个push进栈,当我们需要使用羽毛球的时候,从筒里面拿,也就是pop出栈,但是第一个拿到的羽毛球是我们最后放进去的...public boolean isEmpty(){ return (top == -1); } //删除栈顶元素 public void remove(int top){ //栈顶元素置为null...elementData[top] = null; this.top--; } /** * 是否需要扩容,如果需要,则扩大一倍并返回true,不需要则返回false * @param...最后栈中的内容为空则匹配成功,否则匹配失败!!!

    88850

    深入掌握栈与队列,用Java构建高效数据处理之道

    poll()方法会删除并返回队首元素。如果队列为空,poll()会返回null,避免抛出异常。...dequeue():移除并返回队首元素,实现出队操作;如果队列为空,返回null。peek():返回队首元素但不移除,若队列为空则返回null。...";空栈边界测试:assert stack.peek() == null:调用peek()方法检查栈顶元素,但因为栈为空,peek()应返回null。...若返回非null,断言会失败,并输出"空栈peek测试失败"的信息。assert stack.pop() == null:调用pop()方法尝试从空栈中弹出元素,但因栈为空,pop()应返回null。...小结该测试代码验证了MyStack类的两个关键方面:空栈处理:在栈为空时,pop()和peek()返回null,避免异常,提高代码的健壮性。正常操作:验证栈在有元素时的正确行为,确保后进先出的特性。

    15722

    ,直到子程序执行完后再将地址取出,以回到原来的程序中。...while (true) { //如果符号栈为空,计算到最后的结果,数栈中只有一个数字【结果】 if (operStack.isEmpty()) {...**从左至右扫描**,将3和4压入堆栈; 2. 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈; 3....#具体步骤如下 初始化两个栈:运算符栈s1和储存中间结果的栈s2; 从左至右扫描中缀表达式; 遇到操作数时,将其压s2; 遇到运算符时,比较其与s1栈顶运算符的优先级: 如果s1为空,或栈顶运算符为左括号...“(”,则直接压入s1 如果是右括号“)”,则依次弹出sl栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃 重复步骤⒉至5,直到表达式的最右边 将s1中剩余的运算符依次弹出并压入s2

    42510

    LeetCode精讲——735. 行星碰撞(难度:中等)

    每一颗行星以相同的速度移动。请找出碰撞后剩下的所有行星。 碰撞规则如下所示: 两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。...= 0 三、解题思路 这道题如果我们借助堆栈结构的话,就会很好的实现。因为题中描述了一个重要的点,那就是正数的行星向右行进,负数的行星向左行进。...如下所示: 通过上面的四种情况,我们其实只需要关注【情况四】就可以了,也就是说,当从堆栈中pop出一个元素是正数,并且待放入的元素是负数的时候,才会发生对比碰撞操作;否则其他情况下,就是向堆栈中放入元素即可...如下我们以asteroids = [-2, 1, -1, -2] 为例,通过图形演示一下具体的处理过程。首先:由于stack中是空的,所以第一个元素-2可以顺利进入堆栈中。...stack.isEmpty() && stack.peek() >= 0 && asteroids[i] stack.peek() + asteroids[i] <=

    29950

    图解LeetCode——768. 最多能完成排序的块 II(难度:困难)

    这里面具体操作有如下几个步骤: • 首先:如果堆栈为空,或者遍历到当前数组元素大于等于栈顶元素(top)的话,就将该元素(arr[index])执行入栈操作。...• 其次:如果arr[index]小于栈顶元素,则去对比除栈顶元素之外的元素(可以先pop()掉栈顶元素进行缓存,然后最后再push到堆栈中),如果对比堆栈中的元素大于arr[index],则将堆栈中的该元素执行出栈操作...• 最后:将堆栈中存在元素进行总和统计,返回的数量就是可以拆分最大分组数量。 了解到了具体的操作步骤之后,我们再通过一个例子,来看一下具体的操作过程是怎样的。...我们以arr = [4,2,6,1,8,7,9,10]为例。从头开始遍历数组中的每个元素。...首先,因为堆栈中是空的,所以,我们将index[0]=4这个元素插入到堆栈中;遍历第二个元素index[1]=2,由于栈顶top只有一个元素,并且它小于top指向的元素,所以,没有元素出栈和入栈;遍历第三个元素

    24920

    邂逅栈

    栈的介绍 栈的英文为(stack): 又名堆栈,它是一种运算受限的线性表。...栈的应用场景 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。...if (first == null) { System.out.println("当前循环链表为空, 无法遍历哦~~~");...while (true) { //如果符号栈为空,则计算到最后的结果, 数栈中只有一个数字【结果】 if (operStack.isEmpty()) {...具体步骤如下: 初始化两个栈:运算符栈s1和储存中间结果的栈s2; 从左至右扫描中缀表达式; 遇到操作数时,将其压s2; 遇到运算符时,比较其与s1栈顶运算符的优先级: 如果s1为空,或栈顶运算符为左括号

    45510

    Java栈Stack的使用

    ) { // System.out.println("query"); System.out.println(stack.peek...(); // 获取栈顶元素 但不把栈顶元素去掉 stack.pop(); // 把栈顶元素出栈 并且返回这个元素 这个是和c++的pop的区别 c++的不可以返回栈顶元素 stack.size(); /.../ 获取栈的大小 这个和c++的一样 其他的STL容器获取大小也是这个 stack.isEmpty(); // 判断栈是否为空 返回boolean值 其他的容器也一般用这个方法 stack.search...(); // 返回一个对象在此堆栈上的基于1的位置 意思是把栈顶的index作为1 让依次往下递增 以第一个出现的位置为准 import java.util.*; public class Main...++ i) { System.out.print(stack.get(i) + " "); } /* 运行结果都是 1 2 3 4 5 */ } } 注意事项 如果栈为空的话

    6810

    LeetCode 84&85. Maximal Rectangle&Largest Rectangle in Histogram

    只有当i的位置的值height[i]大头当前栈顶位置所代表的值(height[stack.peek()]),则i位置才可以压入stack。...如果当前的i的位置的值height[i]小于或者等于当前栈顶所代表的值(height[stack.peek()]),则把栈中存的位置不断弹出,直到栈顶所代表的值小于height[i],再把位置i压入栈。...curArea,maxArea); } stack.push(i); } //for循环执行完后,栈不为空,那么继续对栈中的元素处理...,注意这个这个时候计算面积的逻辑为: // (height.length - k -1)*height[j]; while (!...思路: 以每一行做切割,统计以当前行作为低的情况下,每个位置往上的1的数量,使用高度数组height来表示。 1中的每一个情况下求最大的矩形。

    42650
    领券