目录
前言:
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.优先级队列的使用
priority_queue() | |
empty() | |
top() | |
push() | |
pop() |
#############################################################################
#############################################################################
3.优先级队列的模拟实现
上面已经基本上模拟实现了priority_queue,但是还有一个类模板参数没有实现就是仿函数,关于仿函数这个概念是第一次接触,下面首先来介绍一下什么是仿函数:
仿函数:是一个类,需要重载一个()运算符
仿函数的用法:
举例:冒泡排序
没有使用仿函数的冒泡排序
加上仿函数模板参数:
这种泛型也被称为逻辑泛型,可以通过传递不同的仿函数对象控制逻辑
依照上面这种思路,就可以给priority_queue加上仿函数了:
如果用户在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供<或>的重载:
#############################################################################
#############################################################################
4.有关priority_queue的面试题:
#############################################################################
总结:
以上就是关于stack,queue和priority_queue的结构介绍,希望能够在学习C++的路上能够帮助到你!
#############################################################################