一.栈
1.声明
stack<ElemType> s;
如:stack<int> s;//栈中数据类型为int型
2.基本操作
stack <int> s;
int a;
s.push(a);//入栈
s.pop();//出栈
int top=s.top();//取栈顶
bool is_empty=s.empty();//判断栈是否为空
二.队列
1.声明
queue<ElemType> q;
2.基本操作
queue<int> q;
int b;
q.push(b);//入队
q.pop();//出队
int top=q.pop();//取队头
bool is_empty=q.empty();//判断队列是否为空
3.双端队列
deque<int> q;
int b;
q.push_back(b);//入队
q.pop_back();//从队尾出队
q.pop_front();//从队首出队
bool is_empty=q.empty();//判断队列是否为空
三.堆(优先级队列)
1.声明方式
(1)默认
priority_queue<int> q;//默认大根堆
(2)大根堆
priority_queue<int,vector<int>,less<int>> q;
(3)小根堆
priority_queue<int,vector<int>,greater<int>> q;
(4)自定义
struct cmp{
bool operator()(pair<int,int> a,pair<int,int> b){
//< 由小到大 > 由大到小
//注意比较参数a,b的位置,调换位置则反之
return (a.first+a.second<b.first+b.second);
}
}
priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> q;
四.经典例题——合法的出栈序列
已知从1到n的序列依次入栈,判断一个出栈序列是否合法
bool check_is_vaild(queue<int> &order){
stack<int> s;//模拟出栈序列,看栈最后是否为空
int n=order.size();
for(int i=1;i<=n;i++){
s.push(i);
while(!s.empty()&&order.front()==s.top()){
s.pop();
order.pop();
}
}
if(!s.empty()) return false;
return true;
}