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

Posted 森明帮大于黑虎帮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++从青铜到王者第十四篇:STL之stack类的初识和模拟实现相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

系列文章目录



前言


一、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提供了大量能使我们快速便捷地处理数据的函数和方法,非常的便捷所以我们务必掌握。另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。

在这里插入图片描述

以上是关于C++从青铜到王者第十四篇:STL之stack类的初识和模拟实现的主要内容,如果未能解决你的问题,请参考以下文章

C++从青铜到王者第十篇:STL之vector类的模拟实现

C++从青铜到王者第十一篇:STL之list类的初识

C++从青铜到王者第十三篇:STL之list类的模拟实现

C++从青铜到王者第十五篇:STL之queue类的初识和模拟实现

Love2d从青铜到王者第十四篇:Love2d之分享你的游戏(Distributing your game)

Linux从青铜到王者第十四篇:Linux网络基础第一篇