【C++从青铜到王者】第十四篇:STL之stack类的初识和模拟实现

13 篇文章 16 订阅

在这里插入图片描述

系列文章目录



前言


一、stack介绍和使用

1.stack的介绍

stack文档的介绍

  • 翻译:
  • stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
  • stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
  • stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
    在这里插入图片描述
  • 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。
    在这里插入图片描述

2.stack的使用

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS   1
#include<iostream>
#include<stack>
using namespace std;
int main()
{
	stack<int> st1;
	st1.push(1);
	st1.push(2);
	st1.push(3);
	st1.push(4);
	cout << st1.empty() << endl;
	cout << st1.size() << endl;
	//没有迭代器
	while (!st1.empty())
	{
		cout << st1.top() << " ";
		st1.pop();
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

二、stack的模拟实现

栈和队列严格限制先进后出,先进先出的特性,所以栈和队列不支持迭代器。
从栈的接口中可以看出,栈实际是一种特殊的vector,因此使用vector或者list,完全可以模拟实现stack,不过list的效率更低。

#include<iostream>
#include<vector>
#include<list>
namespace yyw
{
	template<class T,class Container>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		T& top()
		{
			return _con.back();
		}

		T& size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}

	private:
		Container _con;
	};
	void teststack1()
	{
		stack<int, std::vector<int>> st1;
		st1.push(1);
		st1.push(2);
		st1.push(3);
		st1.push(4);
		while (!st1.empty())
		{
			std::cout << st1.top() << " ";
			st1.pop();
		}
		std::cout << std::endl;
	}
	void teststack2()
	{
		stack<int, std::list<int>> st1;
		st1.push(10);
		st1.push(9);
		st1.push(8);
		st1.push(7);
		while (!st1.empty())
		{
			std::cout << st1.top() << " ";
			st1.pop();
		}
		std::cout << std::endl;
	}
}

在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了stack的使用,而stack提供了大量能使我们快速便捷地处理数据的函数和方法,非常的便捷所以我们务必掌握。另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。

在这里插入图片描述

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森明帮大于黑虎帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值