当前位置: 首页 > news >正文

C++STL---stack queue模拟实现

前言

对于这两个容器适配器的模拟实现非常简单,因为stack和queue只是对其他容器的接口进行了包装,在STL中,若我们不指明用哪种容器作为底层实现,栈和队列都默认是又deque作为底层实现的。

也就是说,stack和queue不管是用哪种容器实现出来的,实际上定义出来的都是对容器进行了封装。

stack的模拟实现

所以我们知道了容器适配器实际上是对其他容器的封装之后,我们实现的时候就只需要调用底层容器的各个成员函数实现stack的接口就行:

成员函数及作用模拟实现方法
push(元素入栈)调用指定容器的push_back
pop(元素出栈)

调用指定容器的pop_back

top(获取栈顶元素)调用指定容器的back
size(获取栈中有效元素个数)调用指定容器的size
empty(判断栈是否为空)调用指定容器的empty
swap(交换两个栈中的数据)调用指定容器的swap

模拟实现的代码如下:

#pragma once
#include<queue>
#include<iostream>
using namespace std;
namespace CYF
{
	template<class T,class Container=std::deque<T>>
	class stack
	{
	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();
		}

		void swap(stack<T,Container>& st)
		{
			_con.swap(st._con);
		}

	private:
		Container _con;
	};
}

queue模拟实现

同样的我们也通过调用指定容器的成员函数来模拟实现queue。

成员函数及作用模拟实现方法
push(元素队尾入队)调用指定容器的push_back
pop(元素队头出队)调用指定容器的pop_front
front(获取队头元素)调用指定容器的front
back(获取队尾元素)调用指定容器的back
size(获取队列中有效数据个数)调用指定容器的size
empty(判断队列是否为空)调用指定容器的empty
swap(交换两个队列中的数据)调用指定容器的swap

模拟实现的代码如下:

#pragma once
#include<iostream>
#include<list>
#include<queue>
using namespace std;

namespace CYF
{
	template<class T,class Container=deque<T>>
	class queue 
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}

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

		T& front()
		{
			return _con.front();
		}

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

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

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

		void swap(queue<T,Container>& q)
		{
			_con.swap(q._con);
		}
	private:
		Container _con;
	};
}

下面这是test.cpp中的测试代码:

#include"myStack.h"
#include"myQueue.h"
void test1()
{
	CYF::stack<int, vector<int>> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
	cout << endl;
}

void test2()
{
	CYF::queue<int, list<int>> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	while (!q.empty())
	{
		cout << q.front() << " ";
		q.pop();
	}
	cout << endl;
}

int main()
{
	//test1();
	test2();
	return 0;
}

以上就是本篇的全部内容,谢谢大家!

相关文章:

  • 微信小程序实现图片转base64
  • idea中使用maven-helper插件阅读排查【经典版】2
  • Alsa UCM
  • git【工具软件】分布式版本控制工具软件
  • 链表的回文结构OJ
  • CSS实现一个雨滴滑落效果
  • 【第二节】C/C++数据结构之线性表
  • 【linux】自定义快捷命令/脚本
  • 【机器学习】训练GNN图神经网络模型进行节点分类
  • WindowManager相关容器类
  • 【自定义View】Android圆饼进度条
  • 循环嵌套语句的实际应用(2)
  • C#中的实体属性详解与示例
  • 基于Python的北京天气数据可视化分析
  • Kafka之Consumer原理
  • 软光敏的程序实现
  • 顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-同振与顺振的用法
  • [office] 如何才能用EXCEL打开dat文件- #微信#学习方法
  • 植物大战僵尸杂交版2.0.88最新版安装包
  • 【C语言】学生管理系统:完整模拟与实现
  • 短剧剧组在贵州拍戏突遇极端天气,演员背部、手臂被冰雹砸伤
  • 安顺市原副市长、市公安局原局长顾长华任贵州省民委副主任
  • 黔西游船倾覆事故84名落水人员已全部找到,10人不幸遇难
  • 国防部新闻发言人就日本民用飞机侵闯中国钓鱼岛领空答问
  • 中国企业转口贸易破局之道:出口国多元化,内外贸一体化
  • 包揽金银!王宗源、郑九源夺得跳水世界杯总决赛男子3米板冠亚军