queue-概述:
队列是一种特殊的线性表,它只允许在表的前端(Front)进行删除操作,而在表的后端(Rear)进行插入操作。
l进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列中没有元素时,称为空队列。
队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(FIFO—First In First Out)的线性表。
|
bool empty() |
队列为空返回true,否则返回false |
|
void pop() |
删除队列的一个元素 |
|
void push( const TYPE &val ) |
将val元素加入队列 |
|
size_type size() |
返当前队列中的元素数目 |
|
TYPE &back() |
返回一个引用,指向队列的最后一个元素 |
|
TYPE &front() |
返回队列第一个元素的引用 |
题目练习:
(会陆续添加)
priority_queue-概述:
优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。
元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。
|
bool empty() |
优先队列为空返回true,否则返回false |
|
void pop() |
删除优先队列中的第一个元素 |
|
void push( const TYPE &val ) |
添加一个元素到优先队列中,值为val |
|
size_type size() |
返当前队列中的元素数目 |
|
TYPE &top () |
返回一个引用,指向最高优先级的元素 |
题目练习:
(会陆续添加)
1.一道并不简单的综合性题目。(小声告诉你, 读入时考考虑递归)。 set + priority_queue 很虐心哦!
1 #include<iostream> 2 #include<queue> 3 #include<set> 4 #include<vector> 5 using namespace std; 6 7 void parse(vector<set<int> >&adj, unsigned int p=0)//十分巧妙地递归读入。 8 { 9 unsigned int x; 10 cin>>x; 11 if(p) 12 { 13 adj[p].insert(x); 14 adj[x].insert(p); 15 } 16 while(true) 17 { 18 char ch; 19 cin>>ch; 20 if(ch==')') break; 21 parse(adj, x); 22 } 23 return; 24 } 25 26 int main() 27 { 28 //freopen( "in.txt", "r", stdin ); 29 //freopen( "out.txt", "w", stdout ); 30 char ch; 31 while(cin>>ch) 32 { 33 vector<set<int> > adj(1024, set<int>()); 34 parse(adj); 35 priority_queue<int, vector<int>, greater<int> >leafs; 36 int n = 0; 37 for(unsigned int i = 0; i<adj.size();i++) 38 if(adj[i].size()) 39 { 40 n++; 41 if(adj[i].size()==1) 42 leafs.push(i); 43 } 44 for(int k=1; k<n; k++) 45 { 46 unsigned int x = leafs.top(); 47 leafs.pop(); 48 unsigned int p = *(adj[x].begin()); 49 if(k>1) 50 cout<<" "; 51 cout<<p; 52 adj[p].erase(x); 53 if(adj[p].size()==1) 54 leafs.push(p); 55 } 56 cout<<endl; 57 } 58 return 0; 59 }