Java实现栈和最小栈的方法

 更新时间:2026年02月25日 10:47:21   作者:祈安_.  
栈(Stack)是一种常用的数据结构,其核心特点是先进后出,这篇文章主要介绍了Java实现栈和最小栈的相关操作,需要的朋友可以参考下

一、栈的简介

        栈(Stack)是一种常用的数据结构,其核心特点是先进后出。栈主要提供三种基本操作:push(入栈,将元素放入栈顶)、pop(出栈,取出并删除栈顶元素)、peek/top(查看栈顶元素但不删除)。栈可以用数组或链表实现,数组实现操作简单、随机访问快,但容量固定或需要扩容;链表实现则不受容量限制,但需要额外的指针空间。最小栈(MinStack)还可以在 O(1) 时间内获取当前栈的最小值,通过额外的辅助栈记录历史最小值实现。

二、IStack

public interface IStack {
    void push(int x);
    int pop();
    int size();
    boolean empty();
    boolean full();
}

        这段代码定义了一个栈的接口 IStack,用于规范栈的基本功能。接口中声明了五个方法:

push(int x):将元素 x 入栈。

pop():从栈顶弹出元素并返回,如果栈为空,通常会抛出异常。

size():返回栈中当前元素的个数。

empty():判断栈是否为空。

full():判断栈是否已满。

三、MyStack

import java.util.Arrays;
public class MyStack implements IStack{
    private int[] elem;
    private int usedSize;
    private static final int DEFAULT_CAPACITY=10;
    public MyStack(){
        elem=new int[DEFAULT_CAPACITY];
    }
    @Override
    public void push(int x) {
        if(full()){
            elem=Arrays.copyOf(elem,2*elem.length);
        }
        elem[usedSize++]=x;
    }
    @Override
    public int pop() {
        if(empty()){
            throw new EmptyException("栈空了");
        }
        int old=elem[usedSize-1];
        usedSize--;
        return old;
    }
    public int peek(){
        if(empty()){
            throw new EmptyException("栈空了");
        }
        return elem[usedSize-1];
    }
    @Override
    public int size() {
        return usedSize;
    }
    @Override
    public boolean empty() {
        return usedSize==0;
    }
    @Override
    public boolean full() {
        if(usedSize==elem.length){
            return true;
        }
        return false;
    }
}

        这段代码实现了一个顺序栈(数组栈),它通过数组 elem 存储栈中的元素,并用 usedSize 记录当前栈中元素的个数。栈的容量初始为 DEFAULT_CAPACITY(10),当数组满时,push 方法会通过 Arrays.copyOf 将数组扩容为原来的两倍,以保证栈可以动态增长。

        push(int x) 将元素放入栈顶并更新 usedSize

        pop() 从栈顶弹出元素并返回,同时判断栈是否为空,若为空则抛出自定义异常 EmptyException

        peek() 查看栈顶元素但不删除,也会在空栈时抛异常。

        size() 返回栈中当前元素数量,empty() 判断栈是否为空,full() 判断栈是否已满。

四、MinStack

import java.util.Stack;
public class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;
    public MinStack(){
        stack=new Stack<>();
        minStack=new Stack<>();
    }
    public void push(int val){
        stack.push(val);
        if(minStack.empty()){
            minStack.push(val);
        }else{
            int peekVal=minStack.peek();
            if(val<=peekVal){
                minStack.push(val);
            }
        }
    }
    public void pop(){
        int val=stack.pop();
        if(!minStack.empty()){
            if(val== minStack.peek()){
                minStack.pop();
            }
        }
    }
    public int top(){
        return stack.peek();
    }
    public int getMin(){
        if(!minStack.empty()){
            return minStack.peek();
        }
        return -1;
    }
}
import java.util.Stack;
public class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;
    public MinStack(){
        stack=new Stack<>();
        minStack=new Stack<>();
    }
    public void push(int val){
        stack.push(val);
        if(minStack.empty()){
            minStack.push(val);
        }else{
            int peekVal=minStack.peek();
            if(val<peekVal){
                minStack.push(val);
            }
        }
    }
    public void pop(){
        int val=stack.pop();
        if(!minStack.empty()){
            if(val== minStack.peek()){
                minStack.pop();
            }
        }
    }
    public int top(){
        return stack.peek();
    }
    public int getMin(){
        if(!minStack.empty()){
            return minStack.peek();
        }
        return -1;
    }
}

        这段代码实现了一个最小栈,它可以在 O(1) 时间内获取当前栈中的最小值。代码使用了两个 Stack<Integer> 对象:stack 用于存储所有入栈的元素,而 minStack 用于记录栈中历史最小值。

        当执行 push 操作时,如果 minStack 为空或新元素比当前最小值小,就将新元素压入 minStack;这样 minStack 的栈顶始终是当前最小值。

        pop 操作会先从 stack 弹出元素,如果弹出的值等于 minStack 栈顶,也同步弹出 minStack 的栈顶,以保证最小值的正确性。

        top() 方法返回当前栈顶元素,而 getMin() 返回当前最小值。

五、EmptyException

public class EmptyException extends RuntimeException{
    public EmptyException(String msg){
        super(msg);
    }
}

        这段代码定义了一个自定义异常类 EmptyException,它继承自 Java 的 RuntimeException,用于在程序运行时表示“栈或队列为空”的特殊情况。构造方法 EmptyException(String msg) 接收一个字符串参数 msg,并调用父类 RuntimeException 的构造方法,将提示信息传递给异常对象。当栈或队列等数据结构在执行 poppeek 等操作时,如果当前没有元素,就可以抛出这个异常,从而明确地告知调用者操作失败的原因。

到此这篇关于Java实现栈和最小栈的文章就介绍到这了,更多相关java栈和最小栈内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot Session共享实现图解

    SpringBoot Session共享实现图解

    这篇文章主要介绍了SpringBoot Session共享实现图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Spring+SpringMVC+MyBatis整合详细教程(SSM)

    Spring+SpringMVC+MyBatis整合详细教程(SSM)

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架。这篇文章主要介绍了Spring+SpringMVC+MyBatis整合详细教程(SSM),需要的朋友可以参考下
    2017-10-10
  • 详解MyBatis如何在大数据量下使用流式查询进行数据同步

    详解MyBatis如何在大数据量下使用流式查询进行数据同步

    通常的数据同步中,如果数据量比较少的话可以直接全量同步,但是如果数据量很大的话,全量同步需要大量的内存,所以本文为大家介绍了MyBatis使用流式查询实现数据同步的方法,希望对大家有所帮助
    2023-05-05
  • springboot 中整合mybatis多数据源不使用JPA

    springboot 中整合mybatis多数据源不使用JPA

    这篇文章主要介绍了springboot 中整合mybatis多数据源不使用JPA,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 解决在IDEA下使用JUnit的问题(解决过程)

    解决在IDEA下使用JUnit的问题(解决过程)

    很多朋友跟小编反馈在IDEA下使用JUnit进行实例测试的时候出现很多奇葩问题,今天小编通过本文给大家分享idea使用JUnit出现问题及解决过程,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • SpringMVC中的HandlerMapping详解

    SpringMVC中的HandlerMapping详解

    这篇文章主要介绍了SpringMVC中的HandlerMapping详解,HandlerMapping是请求映射处理器,也就是通过请求的url找到对应的逻辑处理单元(Controller),注意这里只是建立请求与Controller的映射关系,最终的处理是通过HandlerAdapt来进行处理的,需要的朋友可以参考下
    2023-09-09
  • Kafka简单客户端编程实例

    Kafka简单客户端编程实例

    这篇文章主要为大家详细介绍了Kafka简单客户端编程实例,利用Kafka的API进行客户端编程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • SpringBoot模板引擎之Thymeleaf的使用

    SpringBoot模板引擎之Thymeleaf的使用

    这篇文章主要介绍了SpringBoot模板引擎之Thymeleaf的使用,模板引擎是以业务逻辑层和表现层分离为目的的,将规定格式的模板代码转换为业务数据的算法实现,它可以是一个过程代码、一个类,甚至是一个类库,需要的朋友可以参考下
    2023-10-10
  • SpringBoot中使用AOP打印接口日志的方法

    SpringBoot中使用AOP打印接口日志的方法

    本篇文章主要介绍了SpringBoot中使用AOP打印接口日志的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • java中对象为null时的打印输出方式

    java中对象为null时的打印输出方式

    这篇文章主要介绍了java中对象为null时的打印输出方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论