国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【041】從零開始:逐步學(xué)習(xí)使用C++ STL中的stack容器

這篇具有很好參考價(jià)值的文章主要介紹了【041】從零開始:逐步學(xué)習(xí)使用C++ STL中的stack容器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

引言


?? 作者簡介:一個(gè)熱愛分享高性能服務(wù)器后臺(tái)開發(fā)知識(shí)的博主,目標(biāo)是通過理論與代碼實(shí)踐的結(jié)合,讓世界上看似難以掌握的技術(shù)變得易于理解與掌握。技能涵蓋了多個(gè)領(lǐng)域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、協(xié)程、DPDK等。
??
??? CSDN實(shí)力新星、CSDN博客專家
??
?? 專欄介紹:從零到c++精通的學(xué)習(xí)之路。內(nèi)容包括C++基礎(chǔ)編程、中級(jí)編程、高級(jí)編程;掌握各個(gè)知識(shí)點(diǎn)。
??
?? 專欄地址:C++從零開始到精通
??
?? 博客主頁:https://blog.csdn.net/Long_xu


?? 上一篇:【040】巧妙地穿梭雙端:掌握C++ STL中deque容器的強(qiáng)大功能

一、stack容器概述

stack是一種先進(jìn)后出(First In Last OutFILO)的數(shù)據(jù)結(jié)構(gòu),它只有一個(gè)出口,形式如圖所示。stack容器允許新增元素,移除元素,取得棧頂元素,但是除了最頂端外,沒有任何其他方法可以存取stack的其他元素。換言之,stack不允許有遍歷行為。有元素入棧的操作稱為:push,將元素推出stack 的操作稱為pop。
【041】從零開始:逐步學(xué)習(xí)使用C++ STL中的stack容器,C++從零開始到精通,學(xué)習(xí),c++,開發(fā)語言,stl,算法,openstack,數(shù)據(jù)結(jié)構(gòu)
Stack所有元素的進(jìn)出都必須符合"先進(jìn)后出"的條件,只有stack頂端的元素,才有機(jī)會(huì)被外界取用。Stack不提供遍歷功能,也不提供迭代器。

二、stack容器常用API

C++的stack容器是通過<stack>頭文件提供的。

  1. 構(gòu)造函數(shù):

    • stack<T> s:創(chuàng)建一個(gè)空的stack,其中T是數(shù)據(jù)類型。
  2. 成員函數(shù):

    • push(const T& val):將元素val壓入棧頂。
    • emplace(Args&&... args):通過參數(shù)構(gòu)造一個(gè)元素并將其壓入棧頂。
    • pop():移除棧頂元素。
    • top():返回棧頂元素的引用。
    • empty():檢查棧是否為空,返回布爾值。
    • size():返回棧中元素的個(gè)數(shù)。
  3. 非成員函數(shù):

    • swap(stack<T>& other):交換兩個(gè)棧的內(nèi)容。

stack不提供遍歷功能,因?yàn)樗且环N后進(jìn)先出(LIFO)數(shù)據(jù)結(jié)構(gòu)。

2.1、構(gòu)造函數(shù)

stack容器的構(gòu)造函數(shù)原型如下:

explicit stack(const Container& cont = Container());

其中,Container是可選參數(shù),用于指定底層容器類型,默認(rèn)為deque。

以下是幾個(gè)使用示例:

示例 1:使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建空的stack

#include <iostream>
#include <stack>

int main() {
    std::stack<int> s; // 默認(rèn)構(gòu)造函數(shù)創(chuàng)建一個(gè)空的stack

    if (s.empty()) {
        std::cout << "Stack is empty!" << std::endl;
    }

    return 0;
}

示例 2:使用vector作為底層容器創(chuàng)建stack

#include <iostream>
#include <stack>
#include <vector>

int main() {
    std::stack<int, std::vector<int>> s; // 使用vector作為底層容器

    s.push(10);
    s.push(20);
    s.push(30);

    while (!s.empty()) {
        std::cout << s.top() << " "; // 輸出棧頂元素
        s.pop(); // 彈出棧頂元素
    }
    
    return 0;
}

示例 3:使用現(xiàn)有容器初始化stack

#include <iostream>
#include <stack>
#include <list>

int main() {
    std::list<int> values = {1, 2, 3, 4};

    std::stack<int, std::list<int>> s(values); // 使用現(xiàn)有容器初始化stack

    while (!s.empty()) {
        std::cout << s.top() << " "; // 輸出棧頂元素
        s.pop(); // 彈出棧頂元素
    }

    return 0;
}

這些示例展示了如何使用stack容器的構(gòu)造函數(shù)來創(chuàng)建空的?;驈默F(xiàn)有容器初始化棧??梢愿鶕?jù)需要選擇不同的底層容器類型,如默認(rèn)的deque或用戶指定的vector、list等。

2.2、賦值操作

可以使用std::stack模板類中的成員函數(shù)swap()來交換兩個(gè)棧的內(nèi)容實(shí)現(xiàn)賦值的效果。

swap()函數(shù)的原型如下:

void swap(stack& other);

使用示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stack1;
    std::stack<int> stack2;

    stack1.push(1);
    stack1.push(2);
    stack1.push(3);

    stack2.push(4);
    stack2.push(5);

    std::cout << "Stack 1: ";
    while (!stack1.empty()) {
        std::cout << stack1.top() << " "; // 輸出棧1的元素
        stack1.pop();
    }
    
    std::cout << "\nStack 2: ";
    while (!stack2.empty()) {
        std::cout << stack2.top() << " "; // 輸出棧2的元素
        stack2.pop();
    }

    stack1.swap(stack2); // 交換棧1和棧2的內(nèi)容

    std::cout << "\nStack 1 after swapping: ";
    while (!stack1.empty()) {
        std::cout << stack1.top() << " "; // 輸出交換后的棧1的元素
        stack1.pop();
    }

    std::cout << "\nStack 2 after swapping: ";
    while (!stack2.empty()) {
        std::cout << stack2.top() << " "; // 輸出交換后的棧2的元素
        stack2.pop();
    }

    return 0;
}

輸出:

Stack 1: 3 2 1 
Stack 2: 5 4 
Stack 1 after swapping: 5 4 
Stack 2 after swapping: 3 2 1 

以上示例中,通過調(diào)用swap()函數(shù)來交換了兩個(gè)棧stack1stack2的內(nèi)容。這樣就實(shí)現(xiàn)了將一個(gè)棧的元素賦值給另一個(gè)棧的效果。

2.3、數(shù)據(jù)存取操作

std::stack容器的數(shù)據(jù)存取操作函數(shù)包括:

  • top():返回棧頂元素的引用,但不會(huì)刪除該元素。
  • push(const T& value):將元素插入到棧頂。
  • pop():移除棧頂元素,沒有返回值。

使用示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stack;

    stack.push(1);
    stack.push(2);
    stack.push(3);

    // 訪問棧頂元素
    int topElement = stack.top();
    std::cout << "Top element: " << topElement << std::endl;

    // 修改棧頂元素
    stack.top() = 4;

    // 移除棧頂元素
    stack.pop();

    std::cout << "Stack elements:";
    while (!stack.empty()) {
        std::cout << " " << stack.top();
        stack.pop();
    }
    std::cout << std::endl;

    return 0;
}

輸出:

Top element: 3
Stack elements: 2 1

2.4、大小操作

std::stack容器提供了以下函數(shù)來進(jìn)行大小操作:

  • empty():返回棧是否為空,如果棧為空則返回true,否則返回false。
  • size():返回棧中元素的數(shù)量。

以下是這些函數(shù)的函數(shù)原型和使用示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stack;

    stack.push(1);
    stack.push(2);
    stack.push(3);

    bool isEmpty = stack.empty();
    std::cout << "Is stack empty? " << (isEmpty ? "Yes" : "No") << std::endl;

    size_t stackSize = stack.size();
    std::cout << "Stack size: " << stackSize << std::endl;

    return 0;
}

輸出:

Is stack empty? No
Stack size: 3

三、使用stack容器實(shí)現(xiàn)一個(gè)高效的算法

使用C++的stack容器實(shí)現(xiàn)簡單算法,該算法用于判斷一個(gè)字符串中的括號(hào)是否匹配。

#include <iostream>
#include <stack>
#include <string>

bool isBracketMatching(const std::string& str) {
    std::stack<char> brackets;

    for (char ch : str) {
        if (ch == '(' || ch == '[' || ch == '{') {
            brackets.push(ch);
        } else if (ch == ')' || ch == ']' || ch == '}') {
            // 如果當(dāng)前字符為右括號(hào)
            if (brackets.empty()) {
                // 棧為空,無法匹配
                return false;
            } else {
                char top = brackets.top();
                brackets.pop();

                // 判斷棧頂元素與當(dāng)前右括號(hào)是否匹配
                if ((top == '(' && ch != ')') ||
                    (top == '[' && ch != ']') ||
                    (top == '{' && ch != '}')) {
                    return false;
                }
            }
        }
    }

    // 所有字符遍歷完成后,棧為空才說明括號(hào)全部匹配
    return brackets.empty();
}

int main() {
    std::string str1 = "({})[]"; // 匹配
    std::string str2 = "{[}]";   // 不匹配

    std::cout << "字符串1括號(hào)" << (isBracketMatching(str1) ? "匹配" : "不匹配") << std::endl;
    std::cout << "字符串2括號(hào)" << (isBracketMatching(str2) ? "匹配" : "不匹配") << std::endl;

    return 0;
}

首先,我們遍歷字符串中的每個(gè)字符,如果遇到左括號(hào)('(''[''{'),我們將其壓入棧中。當(dāng)遇到右括號(hào)時(shí),我們檢查棧頂元素是否與當(dāng)前右括號(hào)匹配,并將棧頂元素彈出。如果任何時(shí)刻棧為空、棧頂元素與當(dāng)前右括號(hào)不匹配,或者遍歷結(jié)束后棧仍然非空,那么就意味著括號(hào)不匹配。

main()函數(shù)中,我們測(cè)試了兩個(gè)字符串的括號(hào)匹配情況,并輸出相應(yīng)的結(jié)果。

運(yùn)行上述代碼,輸出:

字符串1括號(hào)匹配
字符串2括號(hào)不匹配

示例演示了如何利用C++的stack容器來實(shí)現(xiàn)一個(gè)簡單算法,通過使用棧來追蹤括號(hào)的嵌套關(guān)系,并判斷括號(hào)是否匹配。這只是stack容器的一個(gè)簡單應(yīng)用示例,而stack還有其他更多有用的功能可以探索和利用。

總結(jié)

深入講解了C++ STL中的stack容器的基本概念和操作。首先介紹了棧的定義和特點(diǎn),然后詳細(xì)解釋了stack容器的創(chuàng)建和管理方法,包括入棧、出棧和訪問棧頂元素等操作。此外,還重點(diǎn)探討了stack容器的大小操作函數(shù),并通過實(shí)例加深了對(duì)其用法的理解。通過本文的學(xué)習(xí),讀者能夠全面了解如何在C++中運(yùn)用stack來實(shí)現(xiàn)棧結(jié)構(gòu),并且能夠合理地利用stack提高代碼效率和可讀性。無論讀者是初學(xué)者還是有一定經(jīng)驗(yàn)的開發(fā)者,本文都能幫助他們掌握使用C++ STL中的stack容器的技巧和技能,為日后的編程工作打下堅(jiān)實(shí)的基礎(chǔ)。

【041】從零開始:逐步學(xué)習(xí)使用C++ STL中的stack容器,C++從零開始到精通,學(xué)習(xí),c++,開發(fā)語言,stl,算法,openstack,數(shù)據(jù)結(jié)構(gòu)文章來源地址http://www.zghlxwxcb.cn/news/detail-595561.html

到了這里,關(guān)于【041】從零開始:逐步學(xué)習(xí)使用C++ STL中的stack容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】STL中的容器適配器 stack queue 和 priority_queue 的模擬實(shí)現(xiàn)

    【C++】STL中的容器適配器 stack queue 和 priority_queue 的模擬實(shí)現(xiàn)

    適配器是一種設(shè)計(jì)模式 (設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)),該種模式是將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。 例如我們常見的充電器就是一種適配器,它將我們常用的220V交流電壓轉(zhuǎn)化為4,5V (或者其他更高的電

    2023年04月26日
    瀏覽(24)
  • STL容器適配器 -- stack和queue(使用+實(shí)現(xiàn))(C++)

    STL容器適配器 -- stack和queue(使用+實(shí)現(xiàn))(C++)

    棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)+畫圖分析如果對(duì)棧和隊(duì)列的結(jié)構(gòu)不了解的,可以先看該鏈接的內(nèi)容 使用stack時(shí)需要頭文件 #includestack stack是一種容器適配器,用于具有 后進(jìn)先出 (LIFO)的環(huán)境中。只能從容器的一端(棧頂),執(zhí)行刪除、插入和提取操作。 stack是作為容器適配器實(shí)現(xiàn)的,容器

    2024年02月14日
    瀏覽(30)
  • 【C++】開始使用stack 與 queue

    【C++】開始使用stack 與 queue

    送給大家一句話: 忍受現(xiàn)實(shí)給予我們的苦難和幸福,無聊和平庸。 – 余華 《活著》 在之前的學(xué)習(xí)中,我們已經(jīng)對(duì) STL 模板中的 string list vector 等容器進(jìn)行了詳細(xì)的探討,從而獲得了對(duì)這些容器操作的清晰理解?;谶@些知識(shí),現(xiàn)在轉(zhuǎn)向?qū)W習(xí) stack(棧) 和 queue(隊(duì)列)就顯得

    2024年04月23日
    瀏覽(29)
  • 【C++】STL之容器適配器——使用deque適配stack和queue

    【C++】STL之容器適配器——使用deque適配stack和queue

    個(gè)人主頁:??在肯德基吃麻辣燙 分享一句喜歡的話:熱烈的火焰,冰封在最沉默的火山深處。 本文章主要介紹容器適配器的功能,以及一個(gè)適配的場(chǎng)景。 容器適配器,按字面意思理解的話,就是用來對(duì)一個(gè)容器進(jìn)行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

    2024年02月16日
    瀏覽(25)
  • 【C++】STL中stack,queue容器適配器的模擬實(shí)現(xiàn)(使用deque容器)

    【C++】STL中stack,queue容器適配器的模擬實(shí)現(xiàn)(使用deque容器)

    ??博客主頁: 主頁 ??系列專欄: C++ ??感謝大家點(diǎn)贊??收藏?評(píng)論?? ??期待與大家一起進(jìn)步! 雖然stack和queue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因?yàn)閟tack和隊(duì)列只是對(duì)其他容器的接口進(jìn)行了包裝,STL中stack和

    2024年02月15日
    瀏覽(31)
  • 【從零開始學(xué)習(xí)C++ | 第二十一篇】C++新增特性 (上)

    【從零開始學(xué)習(xí)C++ | 第二十一篇】C++新增特性 (上)

    目錄 ?前言: 委托構(gòu)造函數(shù): 類內(nèi)初始化: 空指針: 枚舉類: 總結(jié): ? ? ? ? C++的學(xué)習(xí)難度大,內(nèi)容繁多。因此我們要及時(shí)掌握C++的各種特性,因此我們更新本篇文章,向大家介紹C++的新增特性。 委托構(gòu)造函數(shù)是指一 個(gè)類的構(gòu)造函數(shù)調(diào)用另一個(gè)類的構(gòu)造函數(shù),以減少代

    2024年02月13日
    瀏覽(19)
  • 【從零開始學(xué)習(xí)C++ | 第二十二篇】C++新增特性(下)

    【從零開始學(xué)習(xí)C++ | 第二十二篇】C++新增特性(下)

    目錄 前言: 類型推導(dǎo): constexpr: 初始化列表: 基于范圍的for循環(huán): 智能指針之unique ptr Lambda表達(dá)式: 總結(jié): ????????本文我們將繼續(xù)介紹? ?C++ 11 新增十大特性的剩余六個(gè),如果沒有看過介紹前四個(gè)特性的小伙伴的可以點(diǎn)進(jìn)我C++的專欄就可以看到。 類型推導(dǎo)(

    2024年02月14日
    瀏覽(20)
  • 【如何從零基礎(chǔ)小白開始學(xué)習(xí)C++詳細(xì)介紹】

    如果你想從零基礎(chǔ)開始學(xué)習(xí)C++并最終成為一個(gè)“大佬”級(jí)別的專家,你需要遵循一個(gè)階段性的學(xué)習(xí)計(jì)劃,并且不斷練習(xí)和深入研究,下面是學(xué)習(xí)方向的學(xué)習(xí)階段 學(xué)習(xí)編程基礎(chǔ) 了解編程的基本概念,如變量、數(shù)據(jù)類型、運(yùn)算符、控制結(jié)構(gòu)(循環(huán)、條件判斷)、函數(shù)等。 安裝開

    2024年02月20日
    瀏覽(29)
  • 【C++】STL--stack&quene

    【C++】STL--stack&quene

    這一節(jié)主要學(xué)習(xí)stack、quene和priority_quene的使用以及模擬實(shí)現(xiàn),最后介紹了容器適配器。 目錄 stack的介紹和使用 stack的介紹 stack的使用 stack的模擬實(shí)現(xiàn) queue的介紹和使用 queue的介紹 queue的使用 queue的模擬實(shí)現(xiàn) priority_queue的介紹和使用 priority_queue的介紹 priority_queue的使用 priorit

    2024年04月23日
    瀏覽(18)
  • 【C++】STL之棧(stack)介紹

    【C++】STL之棧(stack)介紹

    棧(stack) 棧 是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除的操作。 插入(push), 彈出(pop)。其特性就是先進(jìn)后出,即先插入的元素最后才能彈出。大家可以把棧想象成一個(gè)彈夾,你只能在頂層一顆一顆裝入子彈,先裝的子彈在最底層,打出時(shí)也只能從上層一

    2023年04月13日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包