栈、队列、堆
一、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
定义一个元素数据类型为 int 的优先队列,元素大的优先级高,称为大根堆。
(2)priority_queue<int, vector
注意最后 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){//判断队列是否为空
//
}