从无到有:模拟 STL 栈和队列的抽象构建艺术

前言

stackqueue使用起来都非常简单,现在来模拟实现一下,理解其底层的原理。


​ 在实现之前,应该知道,stackqueue 都是容器适配器,通过看官网文件也可以看出来;其默认的容器都是deque(双端队列)。

stackqueue 都是在容器的基础上进行了封装,实现了各自的操作。

(在下面的实现中stack默认容器用vectorqueue默认容器用list

stack 模拟

​ 学习过初阶数据结构的栈,大概知道栈是怎么实现的,使用过STL里的stack也知道具体哪些操作,这里就直接开始实现。

1.默认成员函数

​ 对于默认成员函数,因为这里stack是对容器的封装,所以那些构造函数、析构函数、赋值运算符重载等都不需要我们自己去实现,编译器默认生成的会去调用vector(容器)的默认成员函数。

	template<class T, class Container = vector<T>>
	class stack
	{
    
    
		stack() {
    
    }

	private:
		Container _con;
	};

2.基本操作

​ 栈的基本操作无疑就是,入栈、出栈、取栈顶元素、判断栈是否为空。

入栈:

​ 直接调用容器vector的尾插即可。

		void push(const T& x)
		{
    
    
			_con.push_back(x);
		}

出栈:

​ 直接调用容器vector的尾删

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

取栈顶元素:

​ 直接返回容器vector的最后一个元素即可,即调用back()函数

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

判断是否为空:

​ 调用容器的empty函数即可

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

返回栈中元素个数:

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

swap

​ 直接调用容器的swap函数即可。

		void swap(stack& st)
		{
    
    
			_con.swap(st._con);
		}

​ 到这里 就简单实现了我们的stack 结构了,是不是感觉很简单呢?

	template<class T, class Container = vector<T>>
	class stack
	{
    
    
	public:
		stack() {
    
    }
		void push(const T& x)
		{
    
    
			_con.push_back(x);
		}
		void pop()
		{
    
    
			_con.pop_back();
		}
		T& top()
		{
    
    
			return _con.back();
		}
		const T& top()const 
		{
    
    
			return _con.back();
		}
		bool empty() const
		{
    
    
			return _con.empty();
		}
		size_t size() const 
		{
    
    
			return _con.size();
		}
		void swap(Container& st)
		{
    
    
			_con.swap(st._con);
		}
	private:
		Container _con;
	};

queue 模拟

默认成员函数

​ 和stack一样,我们不需要去实现它的默认成员函数,编辑器默认生成的就已经可以满足我们的需求了。

基本操作

push

​ 入队列,在队尾插入

		void push(const T& x)
		{
    
    
			_con.push_back(x);
		}

pop

​ 出队列,从头部删除

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

frontback

​ 返回队头数据 / 队尾数据

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

empty

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

size

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

swap

		void swap(Container& con)
		{
    
    
			_con.swap(con);
		}

​ 到这里stackqueue的模拟实现就完成了,感觉是不是很容易呢。

继续加油!!!

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

猜你喜欢

转载自blog.csdn.net/LH__1314/article/details/143533731