STL容器之stack
浣溪沙·簌簌衣巾落枣花 苏轼
簌簌衣巾落枣花,村南村北响缲车。牛衣古柳卖黄瓜。
酒困路长惟欲睡,日高人渴漫思茶。敲门试问野人家。
stack容器的概念
- stack容器是一种容器适配器(通过封装某个序列式容器,并重新组合该容器中包含的成员函数,使其满足某些特定场景的需要)。
- stack容器提供了一种后进先出的数据结构, LIFO 。
- stack容器并不直接存储元素,而是在已有的容器如vector,deque,list等上进行封装,只提供特定的操作接口,限值了对底层容器的访问方式,使其行为有点类似于栈。
stack的构造函数及接口
template <class _Ty, class _Container = deque<_Ty>>,默认底层封装的容器是deque。
- stack stk, stack的默认构造函数,
- stack(const stack &stk), 拷贝构造函数
code:
#include <iostream>
#include <stack>
#include <deque>
using namespace std;
template<typename T>
void print_pop_stack(stack<T> & stk) // 这里不能用const,因为内部pop改变了stack
{
while (!stk.empty()) // stack有empty用法,判断stack是否为空
{
cout << stk.top() << " "; // 返回栈顶元素
stk.pop(); // 从栈顶移除最后一个元素
}
cout << endl;
}
void test01()
{
deque<int> d1{1, 2, 3};
stack<int> stk1(d1); // 用deque创建
stack<int> stk2(stk1); // 拷贝构造
stk1.push(10);
stk1.push(20);
stk1.push(30);
cout << "\n---------- stk1 ----------" << endl;
cout << "stk1.size(): " << stk1.size() << endl;
print_pop_stack<int>(stk1);
cout << "\n---------- stk2 ----------" << endl;
cout << "pop stack, stk2.size(): " << stk2.size() << endl;
print_pop_stack<int>(stk2); // 模板实现的方式是显式指定类型
cout << stk2.size() << endl;
stack<char> stk3; // 默认构造
stk3.push('a');
stk3.push('b');
cout << "\n---------- stk3 ----------" << endl;
cout << "stk3.size(): " << stk3.size() << endl;
print_pop_stack(stk3); // 模板实现的方式是自动类型推导
}
int main()
{
test01();
system("pause");
return 0;
}
result:
---------- stk1 ----------
stk1.size(): 6
30 20 10 3 2 1
---------- stk2 ----------
pop stack, stk2.size(): 3
3 2 1
0
---------- stk3 ----------
stk3.size(): 2
b a
stack的注意事项
- stack不提供直接访问栈中元素的方法(在不改变stack的情况下,是无法访问所有元素的),只能通过 top() 访问栈顶元素。
- 尝试在空栈上调用 top() 或 pop() 将导致未定义行为。
- stack的底层容器可以是任何支持随机访问迭代器的序列容器,默认是deque。