最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)棧和最小棧的方法

 更新時(shí)間:2026年02月25日 10:47:21   作者:祈安_.  
棧(Stack)是一種常用的數(shù)據(jù)結(jié)構(gòu),其核心特點(diǎn)是先進(jìn)后出,這篇文章主要介紹了Java實(shí)現(xiàn)棧和最小棧的相關(guān)操作,需要的朋友可以參考下

一、棧的簡介

        棧(Stack)是一種常用的數(shù)據(jù)結(jié)構(gòu),其核心特點(diǎn)是先進(jìn)后出。棧主要提供三種基本操作:push(入棧,將元素放入棧頂)、pop(出棧,取出并刪除棧頂元素)、peek/top(查看棧頂元素但不刪除)。??梢杂脭?shù)組或鏈表實(shí)現(xiàn),數(shù)組實(shí)現(xiàn)操作簡單、隨機(jī)訪問快,但容量固定或需要擴(kuò)容;鏈表實(shí)現(xiàn)則不受容量限制,但需要額外的指針空間。最小棧(MinStack)還可以在 O(1) 時(shí)間內(nèi)獲取當(dāng)前棧的最小值,通過額外的輔助棧記錄歷史最小值實(shí)現(xiàn)。

二、IStack

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

        這段代碼定義了一個(gè)棧的接口 IStack,用于規(guī)范棧的基本功能。接口中聲明了五個(gè)方法:

push(int x):將元素 x 入棧。

pop():從棧頂彈出元素并返回,如果棧為空,通常會(huì)拋出異常。

size():返回棧中當(dāng)前元素的個(gè)數(shù)。

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;
    }
}

        這段代碼實(shí)現(xiàn)了一個(gè)順序棧(數(shù)組棧),它通過數(shù)組 elem 存儲(chǔ)棧中的元素,并用 usedSize 記錄當(dāng)前棧中元素的個(gè)數(shù)。棧的容量初始為 DEFAULT_CAPACITY(10),當(dāng)數(shù)組滿時(shí),push 方法會(huì)通過 Arrays.copyOf 將數(shù)組擴(kuò)容為原來的兩倍,以保證??梢詣?dòng)態(tài)增長。

        push(int x) 將元素放入棧頂并更新 usedSize;

        pop() 從棧頂彈出元素并返回,同時(shí)判斷棧是否為空,若為空則拋出自定義異常 EmptyException

        peek() 查看棧頂元素但不刪除,也會(huì)在空棧時(shí)拋異常。

        size() 返回棧中當(dāng)前元素?cái)?shù)量,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;
    }
}

        這段代碼實(shí)現(xiàn)了一個(gè)最小棧,它可以在 O(1) 時(shí)間內(nèi)獲取當(dāng)前棧中的最小值。代碼使用了兩個(gè) Stack<Integer> 對象:stack 用于存儲(chǔ)所有入棧的元素,而 minStack 用于記錄棧中歷史最小值。

        當(dāng)執(zhí)行 push 操作時(shí),如果 minStack 為空或新元素比當(dāng)前最小值小,就將新元素壓入 minStack;這樣 minStack 的棧頂始終是當(dāng)前最小值。

        pop 操作會(huì)先從 stack 彈出元素,如果彈出的值等于 minStack 棧頂,也同步彈出 minStack 的棧頂,以保證最小值的正確性。

        top() 方法返回當(dāng)前棧頂元素,而 getMin() 返回當(dāng)前最小值。

五、EmptyException

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

        這段代碼定義了一個(gè)自定義異常類 EmptyException,它繼承自 Java 的 RuntimeException,用于在程序運(yùn)行時(shí)表示“?;蜿?duì)列為空”的特殊情況。構(gòu)造方法 EmptyException(String msg) 接收一個(gè)字符串參數(shù) msg,并調(diào)用父類 RuntimeException 的構(gòu)造方法,將提示信息傳遞給異常對象。當(dāng)?;蜿?duì)列等數(shù)據(jù)結(jié)構(gòu)在執(zhí)行 pop、peek 等操作時(shí),如果當(dāng)前沒有元素,就可以拋出這個(gè)異常,從而明確地告知調(diào)用者操作失敗的原因。

到此這篇關(guān)于Java實(shí)現(xiàn)棧和最小棧的文章就介紹到這了,更多相關(guān)java棧和最小棧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot Session共享實(shí)現(xiàn)圖解

    SpringBoot Session共享實(shí)現(xiàn)圖解

    這篇文章主要介紹了SpringBoot Session共享實(shí)現(xiàn)圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Spring+SpringMVC+MyBatis整合詳細(xì)教程(SSM)

    Spring+SpringMVC+MyBatis整合詳細(xì)教程(SSM)

    Spring是一個(gè)開源框架,Spring是于2003 年興起的一個(gè)輕量級(jí)的Java 開發(fā)框架。這篇文章主要介紹了Spring+SpringMVC+MyBatis整合詳細(xì)教程(SSM),需要的朋友可以參考下
    2017-10-10
  • 詳解MyBatis如何在大數(shù)據(jù)量下使用流式查詢進(jìn)行數(shù)據(jù)同步

    詳解MyBatis如何在大數(shù)據(jù)量下使用流式查詢進(jìn)行數(shù)據(jù)同步

    通常的數(shù)據(jù)同步中,如果數(shù)據(jù)量比較少的話可以直接全量同步,但是如果數(shù)據(jù)量很大的話,全量同步需要大量的內(nèi)存,所以本文為大家介紹了MyBatis使用流式查詢實(shí)現(xiàn)數(shù)據(jù)同步的方法,希望對大家有所幫助
    2023-05-05
  • springboot 中整合mybatis多數(shù)據(jù)源不使用JPA

    springboot 中整合mybatis多數(shù)據(jù)源不使用JPA

    這篇文章主要介紹了springboot 中整合mybatis多數(shù)據(jù)源不使用JPA,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 解決在IDEA下使用JUnit的問題(解決過程)

    解決在IDEA下使用JUnit的問題(解決過程)

    很多朋友跟小編反饋在IDEA下使用JUnit進(jìn)行實(shí)例測試的時(shí)候出現(xiàn)很多奇葩問題,今天小編通過本文給大家分享idea使用JUnit出現(xiàn)問題及解決過程,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • SpringMVC中的HandlerMapping詳解

    SpringMVC中的HandlerMapping詳解

    這篇文章主要介紹了SpringMVC中的HandlerMapping詳解,HandlerMapping是請求映射處理器,也就是通過請求的url找到對應(yīng)的邏輯處理單元(Controller),注意這里只是建立請求與Controller的映射關(guān)系,最終的處理是通過HandlerAdapt來進(jìn)行處理的,需要的朋友可以參考下
    2023-09-09
  • Kafka簡單客戶端編程實(shí)例

    Kafka簡單客戶端編程實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Kafka簡單客戶端編程實(shí)例,利用Kafka的API進(jìn)行客戶端編程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SpringBoot模板引擎之Thymeleaf的使用

    SpringBoot模板引擎之Thymeleaf的使用

    這篇文章主要介紹了SpringBoot模板引擎之Thymeleaf的使用,模板引擎是以業(yè)務(wù)邏輯層和表現(xiàn)層分離為目的的,將規(guī)定格式的模板代碼轉(zhuǎn)換為業(yè)務(wù)數(shù)據(jù)的算法實(shí)現(xiàn),它可以是一個(gè)過程代碼、一個(gè)類,甚至是一個(gè)類庫,需要的朋友可以參考下
    2023-10-10
  • SpringBoot中使用AOP打印接口日志的方法

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

    本篇文章主要介紹了SpringBoot中使用AOP打印接口日志的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • java中對象為null時(shí)的打印輸出方式

    java中對象為null時(shí)的打印輸出方式

    這篇文章主要介紹了java中對象為null時(shí)的打印輸出方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

腾冲县| 南汇区| 甘肃省| 荥经县| 沅江市| 察雅县| 壤塘县| 菏泽市| 临邑县| 和顺县| 玛多县| 新乡市| 涞水县| 林芝县| 望江县| 贵德县| 尤溪县| 肇州县| 都江堰市| 平江县| 六安市| 扬州市| 积石山| 老河口市| 平度市| 剑川县| 洞口县| 墨脱县| 如皋市| 团风县| 吉隆县| 澳门| 元江| 永福县| 库伦旗| 开远市| 霍林郭勒市| 乐平市| 乃东县| 晋州市| 临汾市|