STL中栈+队列+优先队列基本函数用法
1.栈(stack)
头文件:#include<stack>
声明:stack<int> s
基本操作:
- s.top() 返回栈顶元素
- s.push(x) 将x压入栈中
- s.pop() 将栈顶元素弹出 注意:出栈操作只是删除栈顶元素,并不返回该元素
- s.empty() s空时返回true
- s.size() 返回栈中元素的个数
2.队列(queue)
头文件:#include<queue>
声明:queue<int> q
基本操作:
- q.push(x) 将x加到队尾
- q.pop() 将队头第一个元素弹出 注意:并不返回该元素的值
- q.front() 返回队头元素值
- q.back() 返回对尾元素值
- q.empty(),当队列空时,返回true
- q.size() 返回队列中元素的个数
3.优先队列(priority_queue)
头文件:#include<queue>
声明:priority_queue<Type,Container,Functional> p
(Type为数据类型, Container为保存数据的容器(默认为vector),Functional为元素比较方式(默认用<))
注意:比较方式为<时,反而是大者在前,队头元素最大。有一哥们儿想了一个场景来帮助记忆这里的比较函数的意义:a,b是该数据结构中前后两个元素,如果返回true,这两个元素就需要交换位置,反之则不需要。
要改变比较方式时需要自己写一个结构体cmp,像这样:
struct cmp
{
bool operator()(mystruct a, mystruct b)
{
return a.x > b.x;
}
};
priority_queue<mystruct, vector<mystruct>, cmp> q;
基本操作:
- p.push(x) 将x加入队列
- p.pop() 弹出队列第一个元素
- p.top() 访问队列第一个元素 注意:优先队列用的是top 不是front也没有back!
此题题意:给你一些它进行的操作以及进入和弹出的元素,让你判断是那种数据结构
思路:就是模拟一下三种数据结构,看有无矛盾即可
#include<stdio.h>
#include<stack>
#include<queue> //队列和优先对列都在这个头文件中
using namespace std;
int op[1005],x[1005],n;
int isstack()
{
int i,y;
stack<int> s;
for(i=0;i<n;i++)
if(op[i]==1) s.push(x[i]);
else if(s.empty()) return 0;
else
{
y=s.top();
if(y!=x[i]) return 0;
s.pop();
}
return 1;
}
int isqueue()
{
int i,y;
queue<int> q;
for(i=0;i<n;i++)
if(op[i]==1) q.push(x[i]);
else if(q.empty()) return 0;
else
{
y=q.front();
if(y!=x[i]) return 0;
q.pop();
}
return 1;
}
int ispriority()
{
int i,y;
priority_queue<int> p;
for(i=0;i<n;i++)
if(op[i]==1) p.push(x[i]);
else if(p.empty()) return 0;
else
{
y=p.top();
if(y!=x[i]) return 0;
p.pop();
}
return 1;
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d%d",&op[i],&x[i]);
int st=0,qu=0,pr=0;
st=isstack();
qu=isqueue();
pr=ispriority();
if(st+qu+pr>1) printf("not sure\n");
else if(st) printf("stack\n");
else if(qu) printf("queue\n");
else if(pr) printf("priority queue\n");
else printf("impossible\n");
}
return 0;
}