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

C++標準庫中的Stack(堆棧)和Queue(隊列)詳解

 更新時間:2025年10月28日 10:10:49   作者:m0_74824025  
在C++標準模板庫(STL)中,stack和queue是兩種非常重要的容器適配器,這篇文章主要介紹了C++標準庫中Stack(堆棧)和Queue(隊列)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1. stack(棧)

核心概念

棧是一種 LIFO 的數(shù)據(jù)結(jié)構(gòu)。

  • LIFO: Last-In, First-Out,即后進先出。

  • 想象一疊盤子:你總是從最上面取走盤子,新盤子也總是放在最上面。

頭文件

cpp

#include <stack>

底層容器

默認情況下,stack 使用 deque 作為其底層容器。但你也可以顯式指定使用 vector 或 list。

cpp

stack<int> s1; // 默認使用 deque
stack<int, vector<int>> s2; // 使用 vector 作為底層容器
stack<int, list<int>> s3; // 使用 list 作為底層容器

主要成員函數(shù)

函數(shù)功能時間復(fù)雜度
push(const T& value)將元素壓入棧頂O(1)
pop()彈出棧頂元素O(1)
top()返回棧頂元素的引用O(1)
empty()檢查棧是否為空O(1)
size()返回棧中元素的數(shù)量O(1)

注意stack 沒有提供 begin() 和 end() 方法,因此不能使用范圍 for 循環(huán)來遍歷。遍歷棧的唯一方式是不斷彈出其元素。

基本用法示例

cpp

#include <iostream>
#include <stack>
using namespace std;

int main() {
    stack<int> s;

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

    // 查看棧頂元素
    cout << "Top element: " << s.top() << endl; // 輸出 30

    // 彈出棧頂元素
    s.pop(); // 彈出 30
    cout << "Top after pop: " << s.top() << endl; // 輸出 20

    // 遍歷棧 (會銷毀棧)
    cout << "Stack elements: ";
    while (!s.empty()) {
        cout << s.top() << " ";
        s.pop();

    }
    // 輸出:Stack elements: 20 10
    cout << endl;

    return 0;
}

2. queue(隊列)

核心概念

隊列是一種 FIFO 的數(shù)據(jù)結(jié)構(gòu)。

  • FIFO: First-In, First-Out,即先進先出。

  • 想象排隊買票:先來的人先買到票離開,新來的人排在隊伍末尾。

頭文件

cpp

#include <queue>

底層容器

默認情況下,queue 使用 deque 作為其底層容器。你也可以指定使用 list(但不能用 vector,因為 vector 沒有 pop_front 方法)。

cpp

queue<int> q1; // 默認使用 deque
queue<int, list<int>> q2; // 使用 list 作為底層容器

主要成員函數(shù)

函數(shù)功能時間復(fù)雜度
push(const T& value)將元素添加到隊尾O(1)
pop()移除隊首元素O(1)
front()返回隊首元素的引用O(1)
back()返回隊尾元素的引用O(1)
empty()檢查隊列是否為空O(1)
size()返回隊列中元素的數(shù)量O(1)

注意:和 stack 一樣,queue 也沒有迭代器,不能使用范圍 for 循環(huán)遍歷。

基本用法示例

cpp

#include <iostream>
#include <queue>
using namespace std;

int main() {
    queue<int> q;

    // 添加元素到隊尾
    q.push(10);
    q.push(20);
    q.push(30);

    // 查看隊首和隊尾元素
    cout << "Front element: " << q.front() << endl; // 輸出 10
    cout << "Back element: " << q.back() << endl;  // 輸出 30

    // 移除隊首元素
    q.pop(); // 移除 10
    cout << "Front after pop: " << q.front() << endl; // 輸出 20

    // 遍歷隊列 (會銷毀隊列)
    cout << "Queue elements: ";
    while (!q.empty()) {
        cout << q.front() << " ";
        q.pop();

    }
    // 輸出:Queue elements: 20 30
    cout << endl;

    return 0;
}

關(guān)鍵區(qū)別總結(jié)

特性stack (棧)queue (隊列)
數(shù)據(jù)原則LIFO (后進先出)FIFO (先進先出)
核心操作push()pop()top()push()pop()front()back()
訪問元素只能訪問棧頂 (top)可以訪問隊首 (front) 和隊尾 (back)
典型應(yīng)用函數(shù)調(diào)用棧、表達式求值、撤銷操作消息隊列、CPU 任務(wù)調(diào)度、廣度優(yōu)先搜索

進階:自定義底層容器與使用場景

為什么 stack 可以用 vector,而 queue 不行?

  • stack 只需要在一端進行操作(push_backpop_back),vector 完美支持,且效率很高。

  • queue 需要在兩端進行操作(push_backpop_front)。vector 沒有 pop_front() 方法,如果用它會導(dǎo)致效率極低的 O(n) 操作(需要移動所有元素),所以標準庫禁止了這種用法。

如何選擇底層容器?

  • 默認 deque:在大多數(shù)情況下是最平衡的選擇,兩端操作效率都高。

  • stack 用 vector:如果你確定你的棧操作非常密集,且內(nèi)存分配性能至關(guān)重要,vector 可能稍快一些,因為它使用連續(xù)內(nèi)存。

  • list:如果你需要穩(wěn)定的迭代器(在元素插入刪除時不會失效),或者你的元素非常大,移動成本高,可以考慮 list。

cpp

// 一個使用 vector 作為底層容器的棧
stack<int, vector<int>> my_stack;

// 一個使用 list 作為底層容器的隊列
queue<int, list<int>> my_queue;

總結(jié)

stack 和 queue 是 C++ 中兩個簡單而強大的容器適配器,它們通過限制對底層數(shù)據(jù)的訪問方式,強制實現(xiàn)了特定的數(shù)據(jù)管理規(guī)則。理解它們的 LIFO 和 FIFO 原則是正確使用的關(guān)鍵。它們被廣泛應(yīng)用于各種算法和系統(tǒng)設(shè)計中。

到此這篇關(guān)于C++標準庫中的Stack(堆棧)和Queue(隊列)的文章就介紹到這了,更多相關(guān)C++標準庫stack和queue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

深圳市| 科技| 滨海县| 临邑县| 绥棱县| 康马县| 阿图什市| 宕昌县| 三门峡市| 高尔夫| 江北区| 锡林郭勒盟| 丹寨县| 仁布县| 凉城县| 龙门县| 布尔津县| 桐城市| 黄平县| 南京市| 梅州市| 平利县| 台湾省| 慈溪市| 临颍县| 大埔县| 丁青县| 石屏县| 海安县| 田林县| 那坡县| 涪陵区| 永善县| 九寨沟县| 永丰县| 怀远县| 安徽省| 望奎县| 大宁县| 夏河县| 潼关县|