C++队列和优先权队列的使用—应用:带时限作业排序
C++队列的使用
首先包含头文件
include
队列可以用线性表(list)或双向队列(deque)来实现(注意vector container 不能用来实现queue,因为vector 没有成员函数pop_front!):
queue<list<int>> q1;
queue<deque<int>> q2;
其成员函数有“判空(empty)” 、“尺寸(Size)” 、“首元(front)” 、“尾元(backt)” 、“加入队列(push)” 、“弹出队列(pop)”等操作。
1.back() 返回一个引用,指向最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size() 返回队列中元素的个数
例如,队列在带时限作业排序中的应用
#include<iostream>
`#include<queue>`
using namespace std;
struct Node //状态空间树结点结构
{
Node(Node *par, int k, int num)
{
parent = par; j = k; NodeNum = num;
}
Node *parent; //指向该结点的双亲结点
int j; //该结点代表的解分量x[i]=j
int NodeNum; //该结点的编号,增加的变量,可以不要
};
template<class T>
struct qNode //活结点表中的活结点结构
{
qNode(){}
qNode(T p, T los, int sd, int k, Node *pt)
{
prof = p; loss = los; d = sd; ptr = pt; j = k;
}
T prof, loss; //当前结点X的下界函数c(X)=loss,上界函数u(X)=24-prof
int j, d; //当前活结点所代表的分量x[j]=j, d是迄今为止的时间
Node *ptr; //指向状态空间树中相应的结点
};
template<class T>
class JS
{
public:
JS(T *prof, int *de, int *time, int size);
T JSFIFOBB(); //构造状态空间树,求最优解值
void GenerateAns(int *x, int &k); //一维数组x为最优解向量,k中返回x的分量解
private:
T *p, total; //p为收益数组,total初始为n个作业收益之和
int *t, *d, n; //t为作业处理时间数组,d为按非减次序排列的作业时间数组
Node *ans, *root; //root指向状态空间树的根,ans指向最优解答案结点
};
template<class T>
JS<T>::JS(T *prof, int *de, int *time, int size)
{
n = size;
p = new T[n]; d = new int[n]; t = new int[n];
total = 0;
for (int i = 0; i<n; i++)
{
p[i] = prof[i]; total += p[i];
d[i] = de[i]; t[i] = time[i];
}
}
`#define mSize 20`
template<class T>
T JS<T>::JSFIFOBB()
{
Node *E, *child;
queue< qNode<T> > q; //生成一个FIFO队列实例q
int num = 1; //结点编号num
E = root = new Node(NULL, -1, num); //构造状态空间树的根结点root
cout << " root->NodeNum=" &