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

C++中的stack容器操作大全

 更新時(shí)間:2026年02月11日 09:17:12   作者:你的冰西瓜  
stack是C++標(biāo)準(zhǔn)模板庫(STL)中的容器適配器,它提供后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu)功能,接下來通過本文給大家講解C++中的stack容器的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧

1.stack概述

stack是C++標(biāo)準(zhǔn)模板庫(STL)中的容器適配器,它提供后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu)功能。stack不是獨(dú)立的容器,而是基于其他容器(如deque、list)實(shí)現(xiàn)的適配器。

2. 基本特性

  • 后進(jìn)先出(LIFO):最后壓入的元素最先彈出
  • 容器適配器:基于其他序列容器實(shí)現(xiàn)
  • 限制訪問:只允許訪問棧頂元素
  • 高效操作pushpop操作都是O(1)O(1)O(1)時(shí)間復(fù)雜度
  • 默認(rèn)實(shí)現(xiàn):默認(rèn)使用deque作為底層容器

3. 頭文件與聲明

#include <stack>
using namespace std;
stack<int> s1;               // 默認(rèn)基于deque的整型棧
stack<string, list<string>> s2; // 基于list的字符串棧
stack<double> s3(s1);        // 拷貝構(gòu)造

4. 構(gòu)造函數(shù)與初始化

4.1 默認(rèn)構(gòu)造

stack<int> nums; // 創(chuàng)建空棧

4.2 基于其他容器構(gòu)造

deque<int> dq = {1, 2, 3};
stack<int> s(dq); // 使用deque初始化棧

4.3 指定底層容器類型

stack<string, vector<string>> words; // 使用vector作為底層容器

5. 容量操作

5.1empty()

if (s.empty()) {
    cout << "棧為空";
}

5.2size()

cout << "棧大小: " << s.size();

6. 元素訪問

6.1top()

if (!s.empty()) {
    cout << "棧頂元素: " << s.top();
}

7. 修改操作

7.1push()

s.push(10);     // 壓入元素到棧頂
s.push(20);
s.push(30);

7.2emplace()

s.emplace(40);  // 在棧頂構(gòu)造元素(避免拷貝)

7.3pop()

if (!s.empty()) {
    s.pop();    // 移除棧頂元素(不返回)
}

7.4swap()(C++11)

stack<int> s2;
s.swap(s2);     // 交換兩個(gè)棧的內(nèi)容

8. 完整示例

#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int main() {
    // 創(chuàng)建基于vector的棧
    stack<int, vector<int>> s;
    // 壓入元素
    s.push(10);
    s.push(20);
    s.emplace(30);  // 等同于push但效率更高
    // 查看棧信息
    cout << "棧大小: " << s.size() << endl;
    cout << "棧頂元素: " << s.top() << endl;
    // 彈出元素
    cout << "\n彈出元素: ";
    while (!s.empty()) {
        cout << s.top() << " ";
        s.pop();
    }
    cout << endl;
    // 檢查棧是否為空
    cout << "棧是否為空: " << (s.empty() ? "是" : "否") << endl;
    // 使用其他容器初始化棧
    vector<int> v = {1, 2, 3, 4, 5};
    stack<int, vector<int>> s2(v);
    cout << "\n新棧內(nèi)容: ";
    while (!s2.empty()) {
        cout << s2.top() << " ";
        s2.pop();
    }
    cout << endl;
    return 0;
}

9. 底層容器選擇

stack可以基于以下幾種容器實(shí)現(xiàn):

  1. deque(默認(rèn)):綜合性能好,兩端操作高效
  2. list:在任何位置插入刪除都高效,但內(nèi)存不連續(xù)
  3. vector:內(nèi)存連續(xù),但只在末尾操作高效
// 基于不同容器的棧聲明
stack<int> s1;                     // 默認(rèn)基于deque
stack<int, list<int>> s2;          // 基于list
stack<int, vector<int>> s3;        // 基于vector

10. 實(shí)際應(yīng)用示例

10.1 括號匹配檢查

bool isBalanced(const string& expr) {
    stack<char> s;
    for (char c : expr) {
        if (c == '(' || c == '[' || c == '{') {
            s.push(c);
        } else {
            if (s.empty()) return false;
            char top = s.top();
            s.pop();
            if ((c == ')' && top != '(') || 
                (c == ']' && top != '[') || 
                (c == '}' && top != '{')) {
                return false;
            }
        }
    }
    return s.empty();
}

10.2 表達(dá)式求值(后綴表達(dá)式)

int evaluatePostfix(const string& exp) {
    stack<int> s;
    for (char c : exp) {
        if (isdigit(c)) {
            s.push(c - '0');
        } else {
            int val1 = s.top(); s.pop();
            int val2 = s.top(); s.pop();
            switch (c) {
                case '+': s.push(val2 + val1); break;
                case '-': s.push(val2 - val1); break;
                case '*': s.push(val2 * val1); break;
                case '/': s.push(val2 / val1); break;
            }
        }
    }
    return s.top();
}

11. 性能考慮

  1. 時(shí)間復(fù)雜度

    • push(): O(1)O(1)O(1)
    • pop(): O(1)O(1)O(1)
    • top(): O(1)O(1)O(1)
    • empty(): O(1)O(1)O(1)
    • size(): O(1)O(1)O(1) (某些實(shí)現(xiàn)可能是O(n)O(n)O(n))
  2. 空間復(fù)雜度:取決于底層容器實(shí)現(xiàn)

  3. 底層容器選擇影響

    • vector可能導(dǎo)致內(nèi)存重新分配
    • list有額外指針開銷
    • deque通常是平衡的選擇

12. 注意事項(xiàng)

  1. 調(diào)用top()pop()前必須檢查棧是否為空
  2. stack不提供迭代器,無法遍歷棧內(nèi)元素
  3. 不同底層容器實(shí)現(xiàn)的stack可能有細(xì)微的性能差異
  4. C++11開始支持emplace()swap()操作

13.stack與其他容器比較

特性stackvectordeque
訪問方式僅棧頂隨機(jī)訪問隨機(jī)訪問
插入/刪除位置僅頂端主要末尾兩端
迭代器支持不支持支持支持
內(nèi)存布局依賴底層容器連續(xù)分段連續(xù)

到此這篇關(guān)于C++中的stack容器操作大全的文章就介紹到這了,更多相關(guān)C++ stack容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV如何提取圖片中曲線

    OpenCV如何提取圖片中曲線

    這篇文章主要為大家詳細(xì)介紹了OpenCV如何提取圖片中曲線,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • c++讀取excel的代碼詳解

    c++讀取excel的代碼詳解

    在本篇文章里小編給大家分享的是一篇關(guān)于c++讀取excel的代碼詳解內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • C語言菜鳥基礎(chǔ)教程之for循環(huán)

    C語言菜鳥基礎(chǔ)教程之for循環(huán)

    c語言中的for循環(huán)語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句.
    2017-10-10
  • 一文詳解C語言中的switch語句和while循環(huán)

    一文詳解C語言中的switch語句和while循環(huán)

    這篇文章主要給大家詳細(xì)介紹了C語言中的switch語句和while循環(huán),文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • Visual Studio Code安裝和配置的教程

    Visual Studio Code安裝和配置的教程

    這篇文章主要介紹了Visual Studio Code安裝和配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C/C++中的內(nèi)存管理小結(jié)

    C/C++中的內(nèi)存管理小結(jié)

    這篇文章主要介紹了C/C++中的內(nèi)存管理小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C語言實(shí)現(xiàn)學(xué)生選課系統(tǒng)完整版

    C語言實(shí)現(xiàn)學(xué)生選課系統(tǒng)完整版

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生選課系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C語言實(shí)現(xiàn)簡單反彈球消磚塊游戲

    C語言實(shí)現(xiàn)簡單反彈球消磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單反彈球消磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c語言中unsigned修飾符的使用

    c語言中unsigned修飾符的使用

    在C語言中,unsigned是一種無符號整數(shù)修飾符,本文主要介紹了c語言中unsigned修飾符的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 如何C++使用模板特化功能

    如何C++使用模板特化功能

    這篇文章主要介紹了如何C++使用模板特化功能,通過定義模板,使得函數(shù)或者類不依賴于特定的類型,這樣大幅提升了代碼的復(fù)用性。更多詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03

最新評論

东丽区| 于都县| 杭锦后旗| 黄平县| 黔西县| 邵东县| 北宁市| 舟曲县| 镇赉县| 那曲县| 肥东县| 威远县| 武邑县| 灵山县| 临朐县| 南部县| 莫力| 宿迁市| 开平市| 广德县| 丰都县| 太保市| 兰西县| 永春县| 洛阳市| 新田县| 绥阳县| 肃南| 集安市| 重庆市| 临江市| 漳平市| 建宁县| 分宜县| 武宁县| 岳西县| 都昌县| 奉贤区| 彰武县| 东至县| 闻喜县|