✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
????文章专栏 | ||
「C/C++」C/C++程序设计 | ||
????全部专栏 | ||
「VS」Visual Studio | 「C/C++」C/C++程序设计 | 「UG/NX」BlockUI集合 |
「Win」Windows程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「PK」Parasolid函数说明 |
目录
- std::stack容器详解
- 1. 引用头文件
- 2. 函数构造与对象初始化
- 3. 元素访问
- 4. 迭代器
- 5. 容器
- 6. 修改器
- 7. 元素比较
- 总结与应用
std::stack容器详解
上图截取自黑马C++教程
1. 引用头文件
在C++中,要使用std::stack容器,首先需要包含<stack>
头文件。这个头文件提供了std::stack类的定义,该类是一个容器适配器,提供了基于堆栈(LIFO, Last-In-First-Out)的数据结构。
#include <stack>
2. 函数构造与对象初始化
std::stack类模板的构造函数有几种形式,包括默认构造函数、通过底层容器对象进行构造、使用std::allocator对象作为参数进行构造等。最常用的构造函数是默认构造函数和通过底层容器对象进行构造。
#include <iostream>
#include <stack>
#include <deque>
#include <vector>
int main() {
// 默认构造函数,创建一个空的堆栈
std::stack<int> intStack;
// 使用std::deque作为底层容器的堆栈
std::deque<int> dequeElements = {1, 2, 3, 4, 5};
std::stack<int, std::deque<int>> dequeStack(dequeElements);
// 使用std::vector作为底层容器的堆栈
std::vector<int> vectorElements = {10, 20, 30};
std::stack<int, std::vector<int>> vectorStack(vectorElements);
// 输出堆栈大小
std::cout << "Size of intStack: " << intStack.size() << std::endl;
std::cout << "Size of dequeStack: " << dequeStack.size() << std::endl;
std::cout << "Size of vectorStack: " << vectorStack.size() << std::endl;
return 0;
}
3. 元素访问
std::stack类提供了top()成员函数来访问栈顶元素。需要注意的是,top()函数只是返回栈顶元素的引用,并不从栈中移除该元素。如果栈为空,调用top()函数会导致未定义行为。
#include <iostream>
#include <stack>
int main() {
std::stack<int> myStack;
myStack.push(10);
myStack.push(20);
myStack.push(30);
// 访问栈顶元素
int topElement = myStack.top();
std::cout << "Top element: " << topElement << std::endl;
// 不移除栈顶元素
std::cout << "Top element after access: " << myStack.top() << std::endl;
return 0;
}
4. 迭代器
std::stack不支持迭代器,因为它是序列适配器,不提供遍历功能。只能通过push()
、pop()
、top()
等特定接口访问数据。
#include <stack>
#include <iostream>
using namespace std;
//栈容器常用接口
int main()
{
//创建栈容器 栈容器必须符合先进后出
stack<int> s;
//向栈中添加元素,叫做 压栈 入栈
s.push(10);
s.push(20);
s.push(30);
while (!s.empty()) {
//输出栈顶元素
cout << "栈顶元素为: " << s.top() << endl;
//弹出栈顶元素
s.pop();
}
cout << "栈的大小为:" << s.size() << endl;
}
5. 容器
std::stack本身不拥有数据存储,而是利用其他容器(如std::deque、std::vector)作为其底层,来存储和管理元素。默认情况下,std::stack使用std::deque作为其底层容器。
#include <iostream>
#include <stack>
int main() {
std::stack<int> myStack;
myStack.push(10);
myStack.push(20);
myStack.push(30);
myStack.empty(); // false
std::cout << myStack.size() << std::endl;// 3
}
6. 修改器
std::stack提供了push()
和pop()
成员函数来修改栈中的元素。push()函数在栈顶插入元素,pop()函数移除栈顶元素。
#include <iostream>
#include <stack>
int main() {
std::stack<int> myStack;
// 向栈中添加元素
myStack.push(1);
myStack.push(2);
myStack.push(3);
// 移除栈顶元素
myStack.pop();
// 访问并打印栈顶元素
std::cout << "Top element after pop: " << myStack.top() << std::endl;
return 0;
}
7. 元素比较
std::stack本身不提供元素比较功能,但可以通过比较栈顶元素来间接实现元素比较。需要注意的是,在比较之前应确保栈不为空。
#include <iostream>
#include <stack>
int main() {
std::stack<int> stack1;
std::stack<int> stack2;
stack1.push(10);
stack2.push(20);
if (!stack1.empty() && !stack2.empty()) {
if (stack1.top() < stack2.top()) {
std::cout << "stack1 top is less than stack2 top" << std::endl;
} else {
std::cout << "stack1 top is greater than or equal to stack2 top" << std::endl;
}
}
return 0;
}
总结与应用
std::stack是一个简单且易于使用的容器适配器,提供了基于堆栈的数据结构,适用于许多不同的编程场景。它的主要优点是后进先出(LIFO)的特性,使得它在实现递归和回溯算法、表达式求值(如逆波兰表示法)、深度优先搜索(DFS)算法、括号匹配等需要LIFO数据结构的场景中非常有用。
在使用std::stack时,需要根据具体需求选择合适的底层容器,并小心处理异常和性能问题。默认情况下,std::stack使用std::deque作为其底层容器,但也可以根据需要选择std::vector或其他容器。此外,还需要注意在调用top()或pop()函数之前检查栈是否为空,以避免未定义行为。