【C++】---STL容器适配器之stack

一、什么是适配器?

(1)适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个 类的接口 转换成客户希望的另外一个接口

(2)举个例子:比如对于笔记本来说,电源额定电压是220V,而美国电压是110V,为了能在美国使用,必须要用变压器转换电压以匹配美国电压,那么这个变压器就是个适配器。

为什么stack和queue不是容器?而叫做容器适配器???
(3)虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque。

二、栈

1、栈的性质

(1)在C++中,栈被叫做:容器适配器。栈的特性就是:后进先出,只能从容器的一端进行插入、提取、删除元素。

(2) stack是作为容器适配器被实现的,容器适配器即是对特定类封装将其作为底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素从特定容器的尾部(即栈顶)被压入和弹出。

(3)栈的底层可以是任何标准容器的类模板,或者一些其他的特定容器类。
支持以下操作:

  1. empty()判空操作
  2. back()获取尾部元素
  3. push_back()尾插
  4. pop_back()尾删
    在这里插入图片描述

2、栈类

(1)栈的构造

在这里插入图片描述

int main()
{

	stack<int> st1;



	return 0;
}

(2)empty()


int main()
{

	stack<int> st1;

	cout << st1.empty() << endl;

	return 0;
}

在这里插入图片描述

(3)push()

	stack<int> st1;

	st1.push(1);
	st1.push(2);
	st1.push(3);
	st1.push(4);
	st1.push(5);

(4)pop()

while (!st1.empty())
	{
		cout << st1.top() << " ";

		st1.pop();
	}

(5)top()

int main()
{

	stack<int> st1;

	st1.push(1);
	st1.push(2);
	st1.push(3);
	st1.push(4);
	st1.push(5);

	while (!st1.empty())
	{
		cout << st1.top() << " ";

		st1.pop();
	}
	cout << endl;

	return 0;
}

在这里插入图片描述

(6)size()


int main()
{

	stack<int> st1;

	st1.push(1);
	st1.push(2);
	st1.push(3);
	st1.push(4);
	st1.push(5);



	cout << st1.size() << endl;

	return 0;
}

在这里插入图片描述

三、栈的模拟

注意:栈作为容器适配器、不像string vector list一样是一种完整的容器类。栈不是完整的容器类,而是提供接口的类(相当于在完整容器内的外面包装了一层)它的底层可以用vector实现,也可以用list实现。

栈的构造函数、拷贝构造函数、赋值运算符载函数、析构函数不需要写,会调用vector自己的默认构造函数、拷贝构造函数、赋值运算符重载函数、析构函数。

1、头文件(底层:vector)

#pragma once
#include<iostream>
#include<vector>
#include<list>

using namespace std;

namespace yjl
{
	template<class T ,class Container=std::vector<T>>
	class stack
	{
	private:
		Container _con;
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}

		void pop()
		{
			_con.pop_back();
		}

		T top()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}
	};
}

2、测试文件


#include"stack.h"

void test_stack()
{
	yjl::stack<int> st;

	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	st.push(5);

	cout << st.size() << endl;

	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
	cout << endl;
}

int main()
{
	test_stack();

	return 0;
}

在这里插入图片描述

3、底层也可以为:list

在这里插入图片描述


好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

在这里插入图片描述

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小能软糖_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值