STL容器之stack
- stack容器的概念
- stack的构造函数及接口
- 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。



















