C++系列-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。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值