引言
?? 作者簡介:一個(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。
Stack所有元素的進(jìn)出都必須符合"先進(jìn)后出"的條件,只有stack頂端的元素,才有機(jī)會(huì)被外界取用。Stack不提供遍歷功能,也不提供迭代器。
二、stack容器常用API
C++的stack
容器是通過<stack>
頭文件提供的。
-
構(gòu)造函數(shù):
-
stack<T> s
:創(chuàng)建一個(gè)空的stack
,其中T
是數(shù)據(jù)類型。
-
-
成員函數(shù):
-
push(const T& val)
:將元素val
壓入棧頂。 -
emplace(Args&&... args)
:通過參數(shù)構(gòu)造一個(gè)元素并將其壓入棧頂。 -
pop()
:移除棧頂元素。 -
top()
:返回棧頂元素的引用。 -
empty()
:檢查棧是否為空,返回布爾值。 -
size()
:返回棧中元素的個(gè)數(shù)。
-
-
非成員函數(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è)棧stack1
和stack2
的內(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ǔ)。文章來源:http://www.zghlxwxcb.cn/news/detail-595561.html
文章來源地址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)!