0.适配器
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque。
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高
1.stack
学习文档:cplusplus.com/reference/stack/stack/?kw=stack
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
- empty:判空操作
- back:获取尾部元素操作
- push_back:尾部插入元素操作
- pop_back:尾部删除元素操作
4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。
2.stack常用接口
-
stack() 构造空的栈
#include <iostream>
#include <stack>
int main() {
std::stack<int> s; // 构造一个空的栈
std::cout << "Stack created." << std::endl;
return 0;
}
-
empty() 检测stack是否为空
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
std::cout << "Is the stack empty? " << (s.empty() ? "Yes" : "No") << std::endl;
s.push(10);
std::cout << "Is the stack empty? " << (s.empty() ? "Yes" : "No") << std::endl;
return 0;
}
-
size() 返回stack中元素的个数
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
s.push(10);
s.push(20);
std::cout << "Stack size: " << s.size() << std::endl;
return 0;
}
-
top() 返回栈顶元素的引用
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
s.push(10);
s.push(20);
std::cout << "Top element: " << s.top() << std::endl;
return 0;
}
-
push() 将元素val压入stack中
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
s.push(10);
s.push(20);
std::cout << "Elements in stack: " << s.size() << std::endl;
return 0;
}
-
pop() 将stack中尾部的元素弹出
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
s.push(10);
s.push(20);
std::cout << "Top element before pop: " << s.top() << std::endl;
s.pop();
std::cout << "Top element after pop: " << s.top() << std::endl;
return 0;
}