棧與隊列:數據結構核心解密

棧和隊列的基本

棧(Stack)是一種后進先出(LIFO, Last In First Out)的數據結構。元素的插入和刪除操作只能在棧頂進行。常見的操作包括壓棧(push)和彈棧(pop)。

隊列(Queue)是一種先進先出(FIFO, First In First Out)的數據結構。元素的插入在隊尾進行,刪除在隊頭進行。常見的操作包括入隊(enqueue)和出隊(dequeue)。

操作方式的差異

棧的插入和刪除操作均在棧頂完成。壓棧操作將元素添加到棧頂,彈棧操作移除棧頂元素。棧不支持在中間或底部直接操作。

隊列的插入操作在隊尾完成,刪除操作在隊頭完成。入隊操作將元素添加到隊尾,出隊操作移除隊頭元素。隊列不支持在中間直接操作。

應用場景的不同

棧常用于需要回溯或撤銷的場景,如函數調用棧、括號匹配、表達式求值。遞歸算法的實現也依賴于棧。

隊列常用于需要按順序處理的場景,如任務調度、消息隊列、廣度優先搜索(BFS)。打印任務的管理也是隊列的典型應用。

實現方式的差異

棧可以通過數組或鏈表實現。數組實現的棧需要預先分配固定大小,鏈表實現的棧可以動態擴展。棧的插入和刪除操作時間復雜度均為 O(1)。

隊列也可以通過數組或鏈表實現。數組實現的隊列可能涉及循環隊列以避免空間浪費,鏈表實現的隊列可以動態擴展。隊列的插入和刪除操作時間復雜度均為 O(1)。

性能特點的對比

棧的插入和刪除操作僅涉及棧頂指針的移動,性能高效且簡單。棧的空間復雜度取決于存儲的元素數量。

隊列的插入和刪除操作涉及隊頭和隊尾指針的移動,性能同樣高效。循環隊列的實現可以優化數組空間利用率。

基于C++棧和隊列的實例

以下是基于C++棧和隊列的實例,涵蓋基礎操作、算法應用和實際場景。所有代碼均遵循標準C++語法,可直接編譯運行。

棧(Stack)實例

基礎操作

#include <stack>
#include <iostream>
using namespace std;// 1. 棧的聲明與壓棧
stack<int> s;
s.push(10);
s.push(20);// 2. 彈棧并獲取棧頂
int top = s.top();
s.pop();// 3. 檢查棧是否為空
bool isEmpty = s.empty();// 4. 獲取棧大小
size_t size = s.size();

算法應用

// 5. 括號匹配檢查
bool isValid(string str) {stack<char> st;for (char c : str) {if (c == '(' || c == '{' || c == '[') st.push(c);else if (st.empty() || abs(c - st.top()) > 2) return false;else st.pop();}return st.empty();
}// 6. 逆波蘭表達式求值
int evalRPN(vector<string>& tokens) {stack<int> s;for (string t : tokens) {if (isdigit(t.back())) s.push(stoi(t));else {int b = s.top(); s.pop();int a = s.top(); s.pop();if (t == "+") s.push(a + b);else if (t == "-") s.push(a - b);else if (t == "*") s.push(a * b);else s.push(a / b);}}return s.top();
}

進階應用

// 7. 使用棧實現隊列
class MyQueue {stack<int> in, out;
public:void push(int x) { in.push(x); }int pop() {if (out.empty()) while (!in.empty()) out.push(in.top()), in.pop();int x = out.top(); out.pop();return x;}
};// 8. 最小棧設計
class MinStack {stack<int> s, min_s;
public:void push(int x) {s.push(x);if (min_s.empty() || x <= min_s.top()) min_s.push(x);}void pop() {if (s.top() == min_s.top()) min_s.pop();s.pop();}int getMin() { return min_s.top(); }
};

隊列(Queue)實例

基礎操作

#include <queue>
#include <iostream>
using namespace std;// 1. 隊列聲明與入隊
queue<int> q;
q.push(10);
q.push(20);// 2. 出隊并獲取隊首
int front = q.front();
q.pop();// 3. 檢查隊列是否為空
bool isEmpty = q.empty();// 4. 獲取隊列大小
size_t size = q.size();

算法應用

// 5. 使用隊列實現棧
class MyStack {queue<int> q;
public:void push(int x) {q.push(x);for (int i = 1; i < q.size(); ++i) q.push(q.front()), q.pop();}int pop() { int x = q.front(); q.pop(); return x; }
};// 6. 二叉樹的層次遍歷
void levelOrder(TreeNode* root) {queue<TreeNode*> q;if (root) q.push(root);while (!q.empty()) {TreeNode* node = q.front(); q.pop();cout << node->val << " ";if (node->left) q.push(node->left);if (node->right) q.push(node->right);}
}

實際場景

// 7. 循環隊列實現
class CircularQueue {int *arr, front, rear, size;
public:CircularQueue(int k) : arr(new int[k]), front(-1), rear(-1), size(k) {}bool enQueue(int value) {if (isFull()) return false;if (isEmpty()) front = 0;rear = (rear + 1) % size;arr[rear] = value;return true;}
};// 8. 任務調度器
int leastInterval(vector<char>& tasks, int n) {queue<pair<int, int>> q;priority_queue<int> pq;unordered_map<char, int> cnt;for (char c : tasks) cnt[c]++;for (auto p : cnt) pq.push(p.second);int time = 0;while (!pq.empty() || !q.empty()) {time++;if (!pq.empty()) {int t = pq.top() - 1;pq.pop();if (t > 0) q.push({t, time + n});}if (!q.empty() && q.front().second == time) {pq.push(q.front().first);q.pop();}}return time;
}

完整項目實例

以下為可擴展的完整項目示例(需包含頭文件):

瀏覽器歷史記錄(棧應用)

class BrowserHistory {stack<string> backStack, forwardStack;string current;
public:BrowserHistory(string homepage) : current(homepage) {}void visit(string url) {backStack.push(current);current = url;forwardStack = stack<string>();}string back(int s

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91062.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91062.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《C++初階之STL》【list容器:詳解 + 實現】

【list容器&#xff1a;詳解 實現】目錄前言------------標準接口介紹------------標準模板庫中的list容器是什么樣的呢&#xff1f;1. 常見的構造2. 迭代器操作std::list::beginstd::list::endstd::list::rbeginstd::list::rend3. 容量的操作std::list::sizestd::list::empty…

【灰度實驗】——圖像預處理(OpenCV)

目錄 1 灰度圖 2 最大值法 3 平均值法 4 加權均值法 5 兩個極端的灰度值 將彩色圖轉為灰度圖地過程稱為灰度化。 灰度圖是單通道圖像&#xff0c;灰度化本質就是將彩色圖的三通道合并成一個通道的過程。三種合并方法&#xff1a;最大值法&#xff0c;平均值法和加權均值法…

【linux驅動開發】編譯linux驅動程序報錯:ERROR: Kernel configuration is invalid.

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄一、報錯二、解決方法1.先編譯linux內核源碼2.再重新編譯驅動程序一、報錯 在編譯驅動程序過程中&#xff0c;經常碰到的一個小問題&#xff1a; make -C /home/lu…

Java面試寶典:MySQL中的鎖

InnoDB中鎖的類型非常多,總體上可以如下分類: 這些鎖都是做什么的?具體含義是什么?我們現在來一一學習。 1. 解決并發事務問題 我們已經知道事務并發執行時可能帶來的各種問題。最大的一個難點是:一方面要最大程度地利用數據庫的并發訪問能力,另一方面又要確保每個用戶…

設備識別最佳實踐:四維交叉驗證框架

設備識別最佳實踐&#xff1a;四維交叉驗證框架 1. MAC地址分析&#xff08;40%權重&#xff09; - 設備身份核驗 核心方法&#xff1a; # MAC地址標準化&#xff08;OUI提取&#xff09; mac"B4:2E:99:FB:9D:78" oui$(echo $mac | tr -d : | cut -c 1-6 | tr a-f A-…

《Java 程序設計》第 9 章 - 內部類、枚舉和注解

大家好&#xff0c;今天我們來學習《Java 程序設計》第 9 章的內容 —— 內部類、枚舉和注解。這三個知識點是 Java 中提升代碼靈活性和可讀性的重要工具&#xff0c;在實際開發中非常常用。接下來我們逐一展開講解&#xff0c;每個知識點都會配上可直接運行的代碼示例&#xf…

CTF Misc入門篇

在CTF比賽中&#xff0c;misc方向是必考的一個方向&#xff0c;其中&#xff0c;圖形隱寫是最最常見的類型。 先從Misc開始入門&#xff0c;一般會借助CTF SHOW解題平臺&#xff0c;解題&#xff0c;然后進行技巧總結。 目錄 圖片篇(基礎操作) misc1 misc2 misc3 misc4 …

Vulnhub 02 Breakout靶機

一、信息收集 我是在僅主機模式下掃描的。 以此去訪問端口。 80端口是上面的主頁&#xff0c;查看一下源代碼&#xff0c;發現了如下圖所示的注釋&#xff0c;翻譯過來是&#xff1a;別擔心&#xff0c;沒有人會來這里&#xff0c;安全地與你分享我的訪問權限&#xff0c;它是…

論文閱讀:2024 arxiv AutoDefense: Multi-Agent LLM Defense against Jailbreak Attacks

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AutoDefense: Multi-Agent LLM Defense against Jailbreak Attacks https://arxiv.org/pdf/2403.04783#page9.14 https://www.doubao.com/chat/14064782214316034 文章目錄…

Spring Boot 請求限流實戰:基于 IP 的高效防刷策略

前言 互聯網流量就像洪水猛獸,來得快去得也快。如果不給接口裝個“限速閥”,服務器瞬間被刷爆,宕機成真,根本不稀奇。沒有限流機制,系統就像沒有剎車的賽車,跑得太快反而翻車。為了保證服務穩定、響應迅速,保護后端資源不被惡意請求掏空,限流成必備武器。 本篇文章將…

機器學習第二課之線性回歸的實戰技巧

1 線性回歸簡介 1 線性回歸應用場景 線性回歸是一種用于分析自變量與連續型因變量之間線性關系的模型&#xff0c;其核心是通過擬合線性方程(y w_1x_1 w_2x_2 ... w_nx_n b&#xff09;來預測因變量或解釋自變量的影響。由于其簡單、可解釋性強的特點&#xff0c;線性回歸…

【時時三省】(C語言基礎)指向指針數據的指針變量

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省在了解了指針數組的基礎上&#xff0c;需要了解指向指針數據的指針變量&#xff0c;簡稱為指向指針的指針。怎樣定義一個指向指針數據的指針變量呢?下面定義一個指向指針數據的指針變量&#…

前端css 的固定布局,流式布局,彈性布局,自適應布局,響應式布局

1. 固定布局容器的寬高是固定的&#xff0c;單位一般是px&#xff0c;不會隨著屏幕大小變化2.流式布局&#xff08;百分比布局/vw&#xff09;vw: 視圖寬度的百分比,1vw代表視窗寬度的1% vh: 視圖高度的百分比,1vh代表視窗高度的1%特點: 寬度隨屏幕大小變化單位用%或vw 高度通常…

python學習DAY26打卡

DAY 26 函數專題1&#xff1a;函數定義與參數 內容&#xff1a; 函數的定義 變量作用域&#xff1a;局部變量和全局變量 函數的參數類型&#xff1a;位置參數、默認參數、不定參數 傳遞參數的手段&#xff1a;關鍵詞參數 傳遞參數的順序&#xff1a;同時出現三種參數類型時…

echarts圖表點擊legend報錯問題(折線圖)

原因是&#xff1a;echats 實例&#xff0c;不能夠用響應式變量去接收。<template><div class"attendance-chart"><div v-if"loading" class"loading">加載中...</div><div v-else-if"error" class"e…

Django模型開發:模型字段、元數據與繼承全方位講解

文章目錄一、模型字段類型詳解Django 與 MySQL 字段類型映射整數類型深度對比二、常用字段選項null 與 blank 的區別注釋與幫助文本默認值設置日期時間特殊選項選項列表&#xff08;choices&#xff09;三、模型元數據與方法模型 Meta 類模型管理器&#xff08;Manager&#xf…

墨者:SQL注入實戰-MySQL

1. 墨者學院&#xff1a;SQL注入實戰-MySQL&#x1f680; 2. 實訓重點目標? 目標一&#xff1a; 了解sqlmap的使用及其tamper插件的使用&#xff1b; 目標二&#xff1a; 了解base64編碼及解碼。 3. 解題方向&#x1f50d; 目標網站的id參數通過Base64編碼傳輸&#xff0c;…

Milvus 實戰全流程

&#x1f4da; 學習路徑總覽1. Milvus 基礎知識什么是向量數據庫&#xff1f;Milvus 的核心概念&#xff08;collection、field、index、partition、segment&#xff09;Milvus 和 Faiss、Annoy、HNSW 的區別2. 安裝與部署Docker 快速部署 Milvus&#xff08;推薦&#xff09;本…

Mysql數據庫基礎(入門)

目錄 一.認識Sql 1.什么是Sql 2.Sql的作用 3.Sql通用語法 4.Sql分類 二.數據庫的操作&#xff08;DDL&#xff09; 1.創建數據庫 2.顯示/使用數據庫 3.修改數據庫 4.刪除數據庫 三.常用數據類型 1.數值類型 2.字符串類型 3.日期類型 4.詳細的數據類型 四.表的操…

MySQL 鎖機制 15 連問 · 面試速答版

一、腦圖&#xff1a;鎖全景&#xff08;先記結構&#xff0c;再填細節&#xff09; 鎖層級 ├─ 表鎖 │ ├─ 意向鎖 IS / IX │ └─ 表鎖 READ / WRITE └─ 行鎖├─ 記錄鎖 Record├─ 間隙鎖 Gap└─ 臨鍵鎖 Next-Key二、15 問 15 答&#xff08;面試官一問一…