stack和queue(2): 模拟实现

一、stack的模拟实现

stack是一个容器适配器,它的底层是通过对某种容器类进行封装来实现,标准容器list和vector,deque都符合这些需求,默认情况下,如果没有为stack指定底层容器就默认是使用deque实现。

我们在模拟实现的时候也通过借助容器的方式来实现。

1.1 stack构造以及容量

1.1.1 stack构造

//栈的构造
stack() {}

对于构造函数直接采用默认的无参构造就行。

1.1.2 stack的容量

//返回栈内的元素个数,直接返回容器的size即可
size_t size()const
{
	return c.size();
}
//判断栈是否为空,直接判断容器是否为空即可
bool empty()const
{
	return c.empty();
}

size接口函数直接返回底层容器的size函数的返回值即可,empty判空函数也直接返回底层容器的判空接口即可。

1.2 stack的访问和修改操作

//push直接借助传入容器的push即可
void push(const T& x)
{
	c.push_back(x);
}
//pop借助容器的pop将栈顶元素即数组中的最后一个元素pop掉
void pop()
{
	c.pop_back();
}
//返回栈顶元素即数组的最后一个元素
T& top()
{
	return c.back();
}

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

push接口我们直接调用容器的push_back接口将x尾插到容器里面即可,对于pop接口,由于stack是服从先进后出的原则的,因此调用底层容器的尾删函数即可。对于top接口直接返回容器尾部的元素即可。

1.3 stack模拟实现的完整代码

template<class T, class Con = deque<T>>
//栈
class stack
{

public:
	//栈的构造
	stack() {}
	//push直接借助传入容器的push即可
	void push(const T& x)
	{
		c.push_back(x);
	}
	//pop借助容器的pop将栈顶元素即数组中的最后一个元素pop掉
	void pop()
	{
		c.pop_back();
	}
	//返回栈顶元素即数组的最后一个元素
	T& top()
	{
		return c.back();
	}

	const T& top()const
	{
		return c.back();
	}
	//返回栈内的元素个数,直接返回容器的size即可
	size_t size()const
	{
		return c.size();
	}
	//判断栈是否为空,直接判断容器是否为空即可
	bool empty()const
	{
		return c.empty();
	}

private:

	Con c;

};

以上是我们模拟实现的stack的完整代码。

二、queue的模拟实现

2.1 queue的构造以及容量

2.1.1 queue的构造

//队列的构造
queue() {}

与stack的构造的实现相同,直接使用默认的无参构造即可。

2.1.2 queue的容量

//返回队列中的有效数据,即返回容器的size
size_t size()const
{
	return c.size();
}
//判断队列是否为空,即判断容器是否为空即可
bool empty()const
{
	return c.empty();
}

这里的实现也与stack那边的实现基本相同,对于size直接返回底层容器的size接口即可,对于empty判空操作也是直接返回底层容器的判空接口即可。

2.2 queue的访问和修改操作

//进队列,先进先出,队尾进队头出,选择头插
void push(const T& x)
{
	c.insert(c.begin(), x);
}
//出队列尾删即可
void pop()
{
	c.pop_back();
}
//返回队尾元素,即返回容器的头
T& back()
{
	return c.front();
}

const T& back()const
{
	return c.front();
}
//返回队头元素,即返回容器的尾
T& front()
{
	return c.back();
}

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

对于queue的push由于queue是服从先进先出的原则的,因此我们选择通过头插来实现它的push接口,pop接口就直接调用底层容器的pop_back即可,back接口是用来返回队尾元素的,我们直接返回底层容器的front即可,因为底层容器的实现中是将头作为队列尾的,对于front接口就是与back接口相反了的,直接返回底层容器的back即可。

2.3 queue模拟实现的完整代码

template<class T, class Con = deque<T>>
//队列
class queue
{
public:
	//队列的构造
	queue() {}
	//进队列,先进先出,队尾进队头出,选择头插
	void push(const T& x)
	{
		c.insert(c.begin(), x);
	}
	//出队列尾删即可
	void pop()
	{
		c.pop_back();
	}
	//返回队尾元素,即返回容器的头
	T& back()
	{
		return c.front();
	}

	const T& back()const
	{
		return c.front();
	}
	//返回队头元素,即返回容器的尾
	T& front()
	{
		return c.back();
	}

	const T& front()const
	{
		return c.back();
	}
	//返回队列中的有效数据,即返回容器的size
	size_t size()const
	{
		return c.size();
	}
	//判断队列是否为空,即判断容器是否为空即可
	bool empty()const
	{
		return c.empty();
	}

private:

	Con c;

};

以上就是我们进行模拟实现的queue类的完整代码了。


对于stack和queue的模拟实现到这里就结束了,对于它们的模拟实现我们是通过对其他容器进行封装作为它的底层容器的方式实现的,对于传统的模拟实现也是简单了很多,如果需要博客中的代码请点击下面仓库链接获取:

stack和queue的模拟实现的完整代码

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凪よ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值