数据结构1:栈、队列、优先队列相关的算法题

写在前面:本文介绍数据结构在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
输出
输出最小外部路径长度总和。
样例输入 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;
}


猜你喜欢

转载自blog.csdn.net/qq_24574309/article/details/54236551