栈、队列、堆

一、STL

1.栈

#include<stack>//栈的使用需调用该头文件(也可以用bits/stdc++.h库也就是万能头)
using namespace std;
stack<int> a1;//定义新的栈
int main()
{
	int x;
	a1.push(x);//将x压入栈顶
	a1.size();//返回栈中元素个数
	a1.top();//访问栈顶元素
	a1.pop();//删除栈顶元素
	a1.empty();//判断堆栈是否为空,如果为空返回true,否则返回false
	return 0;
}

2.队列

#include<queue>//队列的使用需调用该头文件(也可以用bits/stdc++.h库也就是万能头)
#include<iostream>
using namespace std;
queue<int> a1;//定义新的队列 
int main()
{
	int x;
	cin>>x;
	a1.push(x);//将x压入栈顶
	a1.size();//返回栈中元素个数
	a1.back();//访问队尾元素
   a1.front();//访问队首元素
	a1.pop();//删除队头元素
	a1.empty();//判断队列是否为空,如果为空返回true,否则返回false
	return 0;
}

3.双端队列

队列,可以在队头插入与删除,也可以在队尾插入与删除,并且可以通 过下标或迭代器访问元素。

常用命令:
(1)定义:
deque<data> deq;//data为结构体类型定义一个元素数据类型为结构体data的deque,里面的元素都是data类型。
(2)插入
deq.push_front(x);//将x插入到队头,x为data类型
deq.push_back(x);//将x插入到队尾,x为data类型。
(3)删除
deq.pop_front();//删除队首元素
deq.pop_back();//删除队尾元素
(4)取某个元素
x=deq.front();//取队首元素,x为data类型
x=deq.back();//取队尾元素,x为data类型
x=deq[i];//取第i个元素(下标从0开始),x为data类型。
(5)求元素的个数
deq.size();
(6)判断是否为空
deq.empty();//判断双端队列是否为空,如果为空返回true否则返回false。
(7)插入
deq.insert(deq.begin()+i,100);//在双端队列中第i个元素的后面插入100,不能直接使用下标来定位
(8)删除
deq.erase(deq.begin()+i);//删除双端队列中第i+1个的元素,不能直接使用下标来定位删除
(9)清除
deq.clear();//清空双端队列(堆栈和队列没有clear这个成员函数)
(10)使用迭代器访问(或遍历)双端队列
deque<int>::iterator it; 
for(it=d.begin();it!=d.end();it++) 
	cout<<*it<<" "; 
deque<int>::reverse_iterator rit;//反向遍历
for(rit=d.rbegin();rit!=d.rend();rit++) 
	cout<<*rit<<" ";

4、优先队列

优先队列、堆(ppt文件)
STL详细使用方法:
1.功能介绍
优先队列,支持插入数据,取出队首元素,队首元素的优先级最高。
2.常用命令
(1)priority_queue q;
定义一个元素数据类型为 int 的优先队列,元素大的优先级高,称为大根堆。
(2)priority_queue<int, vector, greater > a;
注意最后 2 个> >中间要空格隔开,小根堆平时我们用负数建大根堆实现。
(3)priority_queue b;
data 为自己定义的结构体数据类型,此时要自己重载运算符<(优先队列默
认为<运算符)或写比较函数,注意如果用 greater 要重载>运算符。

struct data {
	bool operator<( const data &b ) const {
//结构体内重载<运算符,若需要加快传递数据的速度,用引用方式。
	}
};
bool operator<( data a, data b) { //结构体外重载<运算符
} //小于号的重载建议用这个,放结构体外面
bool cmp(data a, data b) { //同一个结构体建多个堆,用该比较函数
}
priority_queue<data, vector<data>, cmp> c; //堆 c 中的元素为结构体

(4)判断队列是否为空

q.empty();
//如果为空返回 true 否则返回 false

(5)取队首元素

x=q.top()

(6)删除队首元素

q.pop();

(7)插入数据x

q.push(x);

二、数组模拟法

1.栈

int stk[N],tt=0;//定义栈
stk[++tt]=x;//向栈顶插入一个数
tt--;//从栈顶弹出一个数
stk[tt];//栈顶的值
if(tt>0)判断栈是否为空

2.队列

#define N 500000 //用N代替500000
int q[N],hh=0,tt=-1;//hh为队头,tt为队尾
q[++tt]=x;//向队尾插入一个数
hh++;//从队头弹出一个数
q[hh];//队头的值
if(hh<=tt){//判断队列是否为空
	//
}
posted @ 2020-11-03 14:56  VegetableChick  阅读(108)  评论(0编辑  收藏  举报