写在前面:本文介绍数据结构在C++中的用法,欢迎讨论!本系列系本人原创,如需转载或引用,请注明原作者及文章出处。本文持续更新。
本节内容参考了http://blog.csdn.net/smile_kai/article/details/51355989 。
一、栈(stack)
#include <stack> //头文件
stack<int> s; //定义一个 int 型的栈
s.empty() //如果栈为空返回true,否则返回false
s.size() //返回栈中元素的个数
s.pop() //删除栈顶元素但不返回其值
s.top() //返回栈顶的元素,但不删除该元素
s.push() //在栈顶压入新元素
二、队列(queue)
#include <queue> //头文件
queue<int> q; //定义一个 int 型的队列
q.empty() //如果队列为空返回true,否则返回false
q.size() //返回队列中元素的个数
q.pop() //删除队列首元素但不返回其值
q.front() //返回队首元素的值,但不删除该元素
q.push() //在队尾压入新元素
q.back() //返回队列尾元素的值,但不删除该元素
三、优先队列(priority_queue)
优先队列的特点是能够将输入的数据自动按照大小顺序进行排列,每次输出的可以使队列的最大值/最小值。下面以在C/C++环境中的编程为例。
优先队列的头文件一定要包括#include<queue>,但是是从大到小还是从小到大排列,其头文件以及声明变量是有所不同的。如果希望优先队列从大到小排列,每次吐出最大值,那么只包括<queue>这一头文件即可,声明方法为priority_queue<int> q; 。但是如果希望是从小到大排列,每次吐出最小值,那么还需要包括#include<functional>这一头文件,声明方法为priority_queue<int, vector<int>, greater<int>> q; 。
下面是优先队列的一些基础操作:
q.empty() //如果队列为空,则返回true/1,否则返回false/0
q.size() //返回队列中元素的个数
q.pop() //删除队首元素,但不返回其值
q.top() //返回具有最高优先级的元素值,但不删除该元素
q.push(item) //插入元素,item需要包含数值
下面用优先队列解决Huffman编码问题来举例。
问题描述
构造一个具有n个外部节点的扩充二叉树,每个外部节点Ki有一个Wi对应,作为该外部节点的权。使得这个扩充二叉树的叶节点带权外部路径长度总和最小:
Min( W1 * L1 + W2 * L2 + W3 * L3 + … + Wn * Ln)
Wi:每个节点的权值。
Li:根节点到第i个外部叶子节点的距离。
编程计算最小外部路径长度总和。
输入
第一行输入一个整数t,代表测试数据的组数。
对于每组测试数据,第一行输入一个整数n,外部节点的个数。第二行输入n个整数,代表各个外部节点的权值。
2<=N<=100
对于每组测试数据,第一行输入一个整数n,外部节点的个数。第二行输入n个整数,代表各个外部节点的权值。
2<=N<=100
输出
输出最小外部路径长度总和。
样例输入
2
3
1 2 3
4
1 1 3 5
样例输出
9
17
代码
#include<iostream>
#include<algorithm>
#include<queue>
#include<functional>
using namespace std;
int T, n, w[110], min1, min2, ans, temp;
priority_queue<int, vector<int>, greater<int>> wi;
int main()
{
cin >> T;
for (int t = 0; t < T; t++)
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> w[i];
wi.push(w[i]);
}
ans = 0;
while (1)
{
min1 = wi.top();
wi.pop();
min2 = wi.top();
wi.pop();
temp = min1 + min2;
ans += temp;
if (!wi.empty())
wi.push(temp);
else
break;
}
cout << ans << endl;
}
system("pause");
return 0;
}