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 }
View Code

 

相关文章: