《栈~~队列~~优先级队列》

目录

前言:

1.stack

1.stack的介绍

2.stack的使用:

3.stack的模拟实现

4.有关stack的oj笔试题

2.queue

1.队列的介绍

2.队列的使用

3.队列的模拟实现

4.有关队列的oj笔试题

3.priority_queue

1.优先级队列的介绍

2.优先级队列的使用

3.优先级队列的模拟实现

4.有关priority_queue的面试题:

总结:

############################################################################# 

致前行的人:

                要努力,但不要着急,繁花锦簇,硕果累累都需要过程!

 

#############################################################################

 

前言:

        本篇文章主要介绍STL中的stack和queue以及priority_queue的基本使用和模拟实现以及stack和queue以及priority_queue的结构在算法题中的应用。

#############################################################################

1.stack

1.stack的介绍

1.stack是一种容器适配器,数据特点是后进先出。

2.stack是作为容器适配器实现的,容器适配器是对特定类作封装作为底层实现,并提供一组特定的成员函数访问元素

3.stack的底层容器可以是任何标准的容器类模板或者是一些其它类的特定容器类,这些容器类应该支持一下操作:

~empty:判空操作        ~back:获取尾部的元素        ~push_back:尾部插入元素操作

~pop_back:尾部删除元素操作

4.标准容器vector,list.deque均符合这些需求,默认情况下没有为stack指定特定的容器,默认情况下使用的是deque.

#############################################################################

2.stack的使用:

stack()构造空的栈
empty()检测栈是否为空
size()返回栈中的元素个数
top()返回栈顶的数据
push()将元素插入栈中
pop()删除栈顶的元素

 #############################################################################

#############################################################################

3.stack的模拟实现

从栈的接口可以看出,栈其实是一种特殊的vector,因此使用vector可以完全模拟实现stack:

#include<vector>
namespace st
{
	template<class T>
	class stack
	{
	public:
		stack()
		{};
		void push(const T& val)
		{
			s.push_back(val);
		}
		void pop()
		{
			s.pop_back();
		}
		T& top()
		{
			return s.back();
		}
		size_t size() const
		{
			return s.size();
		}
		bool empty() const
		{
			return s.empty();
		}
	private:
		std::vector<T> s;
	};
}

除了可以使用vector实现之外还可以使用list和deque容器实现,所以为了使用起来方便可以在提供一个容器模板参数,这样可以任意切换。

#############################################################################

#############################################################################

4.有关stack的oj笔试题

练习题1最小栈

 练习题二栈的弹出和压入序列

 练习题三逆波兰表达式求值

练习题四:用栈实现队列 

#############################################################################

#############################################################################

2.queue

1.队列的介绍

1.队列是一种容器适配器,数据满足先进先出的特点。

2.队列作为容器适配器实现,容器适配器将特定容器类封装作为其底层容器类,queue提供一组特定的成员来实现对数据的访问。

3.底层容器可以是标准容器类模板之一,也可以是专门设计的容器类,该底层容器应该至少支持以下操作:

~empty:判断队列是否为空        ~size:返回队列中有效元素的个数        ~front返回队头元素

~back:返回队尾元素        ~push_back:在队列尾部入元素        ~pop_front:删除队列头部的元素

4.标准容器类list和deque满足这些要求,默认情况下,如果没有为queue指定容器类,默认使用的是deque.

2.队列的使用

queue()构造空的队列
empty()判断队列是否为空
size()返回队列中有效元素的个数
front()返回队头的元素
back()返回队尾的元素
push()在队尾入元素
pop()队头元素出队列

############################################################################# 

#############################################################################

3.队列的模拟实现

queue的底层实现和stack一样可以使用vector和list以及deque,但是使用vector头删需要挪动数据时间复杂过高,所以一般使用list和deque,可以提供一个容器模板参数,使用时进行切换。

namespace q
{
	template<class T,class Container = deque<T>>
	class queue
	{
	public:
		queue()
		{};
		void push(const T& val)
		{
			_q.push_back(val);
		}
		const T& front()
		{
			return _q.front();
		}
		const T& back()
		{
			return _q.back();
		}
		void pop()
		{
			_q.pop_front();
		}
		bool empty()
		{
			return _q.empty();
		}
		size_t size()
		{
			return _q.size();
		}

	private:
		Container _q;
	};
}

 #############################################################################

#############################################################################

4.有关队列的oj笔试题

用队列实现栈

 #############################################################################

 #############################################################################

3.priority_queue

1.优先级队列的介绍

1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。

2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:
~empty():检测容器是否为空  ~size():返回容器中有效元素个数
~front():返回容器中第一个元素的引用  ~push_back():在容器尾部插入元素
~pop_back():删除容器尾部元素
5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。
6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数 make_heap、push_heap和pop_heap来自动完成此操作。

 #############################################################################

 #############################################################################

2.优先级队列的使用

priority_queue()
empty()
top()
push()
pop()

 #############################################################################

 #############################################################################

3.优先级队列的模拟实现

 

上面已经基本上模拟实现了priority_queue,但是还有一个类模板参数没有实现就是仿函数,关于仿函数这个概念是第一次接触,下面首先来介绍一下什么是仿函数:

仿函数:是一个类,需要重载一个()运算符

仿函数的用法:

举例:冒泡排序

没有使用仿函数的冒泡排序

加上仿函数模板参数:

这种泛型也被称为逻辑泛型,可以通过传递不同的仿函数对象控制逻辑

依照上面这种思路,就可以给priority_queue加上仿函数了:

如果用户在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供<或>的重载:

 

 #############################################################################

 #############################################################################

4.有关priority_queue的面试题:

#############################################################################

总结:

以上就是关于stack,queue和priority_queue的结构介绍,希望能够在学习C++的路上能够帮助到你!

 

#############################################################################

  • 32
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

linkindly

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

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

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

打赏作者

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

抵扣说明:

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

余额充值