C++ stack与queue 以及priority_queue

39 篇文章 0 订阅

stack

概念
stack满足后进先出操作的环境,只能从容器的一端进行插入和提取的操作。

stack的使用:

stack<int> s;//构造空栈
if (s.empty())//判断栈是否为空
	cout << "空" << endl;
else
	cout << "非空" << endl;
s.push(1);//入栈
s.push(2);
s.push(3);
s.push(4);
cout << "栈内元素的个数:" << s.size() << endl;//输出栈内元素个数
cout << "栈顶元素:" << s.top() << endl;//输出栈顶元素
s.pop();//将栈尾元素出栈
cout << "弹出栈顶元素之后的栈顶为:" << s.top() << endl;
system("pause");
return 0;

在这里插入图片描述

queue

概念:
1.队列是一种容器适配器,其中从容器一端插入元素,另一端提取元素。
2.队列的元素,满足从队尾进去,队头出队,实行先进先出的原则。
在这里插入图片描述
queue的使用

queue<int> q;
if (q.empty())//判断队列是否为空
	cout << "空" << endl;
else
	cout << "非空" << endl;
q.push(1);//入队列
q.push(2);
q.push(3);
cout << "队列元素的个数:" << q.size() << endl;//输出队列元素个数
cout << "队头元素:" << q.front() << endl;//输出队列队头元素
cout << "队尾元素:" << q.back() << endl;//输出队列队尾元素
q.pop();//将队头元素出队列
cout << "出队后队头元素:" << q.front() << endl;
cout << "出队后队尾元素:" << q.back() << endl;

在这里插入图片描述

priority_queue

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意: 默认情况下priority_queue是大堆

priority_queue的使用
1.默认情况下,优先级队列priority_queue为大堆。

vector<int> v{1, 2, 3, 5, 9, 7, 4, 6, 8, 10};
priority_queue<int> q;//构造一个空的优先级队列
if (q.empty())//判断队列是否为空
	cout << "空" << endl;
else
	cout << "非空" << endl;
for (auto e : v)
	q.push(e);//入队
cout << "优先级队列的队头元素(队列中的最大值或最小值,即堆顶元素)" <<q.top()<< endl;//输出优先级队列队头元素,也就是队列中最大或者做小的元素,即堆顶元素。
q.pop();//删除队头元素。
cout << "删除后优先级队列的队头元素(队列中的最大值或最小值,即堆顶元素)" << q.top() << endl;

在这里插入图片描述
2.如果在priority_queue放自定义类型的数据,需要在自定义类型中提供>和<的重载。

priority_queue<Date> q;
//大堆,需要在自定义类型中提供<的重载
q.push(Date(2019, 10, 19));
q.push(Date(2019, 10, 20));
q.push(Date(2019, 10, 21));
cout << q.top() << endl;


//小堆,需要在自定义类型中提供>堆的重载
priority_queue<Date,vector<Date>,greater<Date>> q2;//模板参数列表中,用greater所以是小堆
q2.push(Date(2019, 10, 19));
q2.push(Date(2019, 10, 20));
q2.push(Date(2019, 10, 21));
cout << q2.top() << endl;

在这里插入图片描述
3.如果在priority_queue放指针,虽然可以直接比较,但是结果是按照地址给出的大堆或小堆,如果想要让其按照指针所指向的空间元素给出的大小堆,必须改变比较规则。

class Date
{
friend class compare;
public:
Date(int year, int month, int day)
	: _year(year)
	, _month(month)
	, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
class compare
{
public:
bool operator()(Date* pLeft, Date* pRight)
{
	if (pLeft->_day < pRight->_day)//按照less的方法,得出大堆
	{
		return true;
	}
	else
		return false;
}
};
int main()
{
Date d1(2019, 10, 18);
Date d2(2019, 10, 16);
Date d3(2019, 10, 17);
priority_queue<Date*, vector<Date*>, compare> q2;
q2.push(&d1);
q2.push(&d2);
q2.push(&d3);
return 0;
}

在这里插入图片描述
优先级队列默认为大堆的原因:
取决于优先级队列的模板参数列表里的参数

下面是:优先级队列的函数模板参数列表。

template <class T, class Container = vector<T>,class Compare = less<typename Container::value_type> > class priority_queue;

第一个参数:class T:代表的是优先级队列里放的元素类型。
第二个参数:class Container =vector:从概念知道,优先级队列的底层是堆,而堆又要放在数组中,所以用vector;
第三个参数:决定优先级队列是大堆或是小堆,在将数据放入数组中时,要将放入的元素进行比较,用less代表的是<,所以是大堆,用greater代表是>,所以是小堆。注意: 用less和greater时,要用< functional >的头文件

因为优先级队列的模板参数列表中,第三个参数默认的是用less所以优先级队列默认的是大堆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值