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

C語言之包含min函數(shù)的棧實(shí)例詳解

 更新時(shí)間:2022年02月18日 11:08:40   作者:愛你哦小豬豬  
這篇文章主要為大家詳細(xì)介紹了C語言之包含min函數(shù)的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、題目描述

定義棧的數(shù)據(jù)結(jié)構(gòu),請(qǐng)?jiān)谠擃愋椭袑?shí)現(xiàn)一個(gè)能夠得到棧的最小元素的 min 函數(shù)在該棧中,調(diào)用 min、push 及 pop 的時(shí)間復(fù)雜度都是 O ( 1 ) \rm{O(1)} O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();      --> 返回-3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();      --> 返回-2.

提示:各函數(shù)的調(diào)用總次數(shù)不超過 20000 次

二、思路分析

:思路分析中的一些內(nèi)容和圖片參考自力扣各位前輩的題解,感謝他們的無私奉獻(xiàn)

分析

普通棧的push()pop()函數(shù)的復(fù)雜度為O(1),而獲取棧最小值min()函數(shù)需要遍歷整個(gè)棧,復(fù)雜度為O(N)。

本題需要將min()函數(shù)復(fù)雜度降為O(1),則可通過建立輔助棧實(shí)現(xiàn)。棧1用于存儲(chǔ)所有元素,入棧 push() 函數(shù)、出棧 pop() 函數(shù)、獲取棧頂 top() 函數(shù)保持正常。棧2棧頂始終放著棧1最小元素,這樣就可以實(shí)現(xiàn)min()函數(shù)的O(1)復(fù)雜度。

函數(shù)設(shè)計(jì)

push(x) 函數(shù)

①棧1正常進(jìn)行入棧即可

②棧2則需要注意,棧2的棧頂一定是棧1的最小元素。每次入棧時(shí),判斷棧2是否為空。若為,則將x壓入棧2。若棧2不為空,判斷x與棧2的棧頂元素的大小關(guān)系,若x棧2的棧頂元素,則將x壓入棧2。

pop()函數(shù)

①棧1正常進(jìn)行出棧即可

②棧2則需要注意,棧1出棧1個(gè)元素后,棧2的棧頂元素仍然要為棧1的最小元素。每次出棧時(shí),將出棧元素標(biāo)記為y,若y等于棧2的棧頂元素,則棧2也執(zhí)行出棧

top() 函數(shù)

直接返回棧1的棧頂元素即可

min() 函數(shù)

直接返回棧2的棧頂元素即可

示例

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

三、整體代碼

整體代碼如下

#define N 20000

//創(chuàng)建兩個(gè)棧,棧1用于正常的入棧出棧操作,棧2用于將棧1的最小元素防在棧頂
typedef struct {
    int *Stack1;
    int *Stack2;
    int top1;
    int top2;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack* MS=(MinStack*)malloc(sizeof(MinStack));
    MS->Stack1 = (int*)malloc(sizeof(int)*N);
    MS->Stack2 = (int*)malloc(sizeof(int)*N);
    MS->top1 = -1;
    MS->top2 = -1;
    return MS;
}

void minStackPush(MinStack* obj, int x) {
    obj->Stack1[++obj->top1] = x; //棧1正常入棧
    if(obj->top2 == -1){   //如果棧2是空的
        obj->Stack2[++obj->top2] = x; //將x也壓入棧2
    }
    else{
        //如果棧2不空,同時(shí)x<=棧2的棧頂元素
        if(x <= obj->Stack2[obj->top2]){
            //將x壓入棧2的棧頂
            obj->Stack2[++obj->top2] = x;
        }
    }

}

void minStackPop(MinStack* obj) {
    //保存棧1的棧頂元素,同時(shí)top1-1
    int a = obj->Stack1[obj->top1];
    obj->top1--;
    //如果棧1的棧頂元素等于棧2的棧頂元素,則將棧2的棧頂元素彈出,top2-1
    if(a==obj->Stack2[obj->top2]){
        obj->top2--;
    }
}

//正常返回棧1的棧頂元素即可
int minStackTop(MinStack* obj) {
    return obj->Stack1[obj->top1];
}

//正常返回棧2的棧頂元素即可
int minStackMin(MinStack* obj) {
    return obj->Stack2[obj->top2];
}

void minStackFree(MinStack* obj) {
    free(obj->Stack1);
    free(obj->Stack2);
    free(obj);
}

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, x);
 
 * minStackPop(obj);
 
 * int param_3 = minStackTop(obj);
 
 * int param_4 = minStackMin(obj);
 
 * minStackFree(obj);
*/

運(yùn)行,驗(yàn)證通過

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • c++通過引用實(shí)現(xiàn)三個(gè)數(shù)字求最大值

    c++通過引用實(shí)現(xiàn)三個(gè)數(shù)字求最大值

    下面我們將通過這個(gè)例子來說明引用的作為函數(shù)參數(shù)的使用方法。需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-10-10
  • C/C++左旋字符串實(shí)現(xiàn)代碼舉例

    C/C++左旋字符串實(shí)現(xiàn)代碼舉例

    在C/C++語言中沒有專門的字符串變量,通常用字符數(shù)組來存放字符串,下面這篇文章主要給大家介紹了關(guān)于C/C++左旋字符串實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • C++中的Primer拷貝控制和資源管理詳解

    C++中的Primer拷貝控制和資源管理詳解

    這篇文章主要介紹了C++中的Primer拷貝控制和資源管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例

    C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例

    字符串不僅可以轉(zhuǎn)換為整數(shù),也可以轉(zhuǎn)換為浮點(diǎn)數(shù),本文主要介紹了C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-02-02
  • 簡(jiǎn)要對(duì)比C語言中三個(gè)用于退出進(jìn)程的函數(shù)

    簡(jiǎn)要對(duì)比C語言中三個(gè)用于退出進(jìn)程的函數(shù)

    這篇文章主要介紹了C語言中三個(gè)用于退出進(jìn)程的函數(shù)的對(duì)比,分別為_exit()函數(shù)和on_exit()函數(shù)以及atexit()函數(shù),需要的朋友可以參考下
    2015-08-08
  • 總結(jié)c++性能優(yōu)化策略

    總結(jié)c++性能優(yōu)化策略

    在本篇文章中小編給大家總結(jié)了關(guān)于C++的性能優(yōu)化策略的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • 使用c++實(shí)現(xiàn)OpenCV繪制旋轉(zhuǎn)矩形圖形

    使用c++實(shí)現(xiàn)OpenCV繪制旋轉(zhuǎn)矩形圖形

    這篇文章主要給大家介紹了使用c++實(shí)現(xiàn)OpenCV繪制圖形旋轉(zhuǎn)矩形的方法案例,通過圖文及代碼形式進(jìn)行了詳細(xì)的描述,有需要的朋友可以參考下,希望可以有所幫助
    2021-08-08
  • 解析C++ 浮點(diǎn)數(shù)的格式化輸出

    解析C++ 浮點(diǎn)數(shù)的格式化輸出

    本篇文章是對(duì)C++中浮點(diǎn)數(shù)的格式化輸出進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • vscode C++遠(yuǎn)程調(diào)試運(yùn)行(學(xué)習(xí)C++用)

    vscode C++遠(yuǎn)程調(diào)試運(yùn)行(學(xué)習(xí)C++用)

    這篇文章主要介紹了vscode C++遠(yuǎn)程調(diào)試運(yùn)行(學(xué)習(xí)C++用),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C++計(jì)數(shù)排序詳解

    C++計(jì)數(shù)排序詳解

    計(jì)數(shù)排序的思想我們之前接觸過的例如:插入排序,歸并排序,快速排序,堆排序等都是基于集合元素之間的比較這一基本的思想,它們執(zhí)行的時(shí)間復(fù)雜度最優(yōu)是趨于O(nlgn),而計(jì)數(shù)排序的運(yùn)行機(jī)制不是基于集合元素之間的大小比較
    2016-04-04

最新評(píng)論

亳州市| 鸡东县| 广宁县| 建阳市| 尤溪县| 海南省| 阿图什市| 兴化市| 诏安县| 灵山县| 寿光市| 吉水县| 兴义市| 印江| 朝阳区| 乌兰察布市| 沁源县| 武清区| 台北县| 南丹县| 梁山县| 故城县| 贵州省| 临海市| 屏东县| 益阳市| 内黄县| 乐亭县| 黄陵县| 商水县| 永泰县| 黄龙县| 岳阳县| 彩票| 西充县| 获嘉县| 麻江县| 大荔县| 镶黄旗| 治县。| 潼关县|