#include<assert.h>
using namespace std;
enum staff{Manager,Supervisor,Worker};
struct JobRequest //員工請求類,要加入到優先級隊列中
{
staff staffPerson;
int jobID;
int jobTime;
JobRequest *next;
JobRequest(staff person = Worker,int ID = 0,int time = 0,JobRequest *link = NULL)
{
staffPerson=person;
jobID=ID;
jobTime=time;
next=link;
}
~JobRequest()
{}
};
class PQueue //鏈式優先級隊列類
{
private:
JobRequest *front,*rear;
public:
PQueue()
{
front=NULL;
rear=NULL;
}
void EnQueue(staff person,int ID,int time) //入隊列函數
{
if(front == NULL)
front = rear = new JobRequest(person, ID, time, NULL);
else
rear = rear->next = new JobRequest(person, ID, time, NULL);
}
JobRequest DeQueue() //優先級隊列出隊列函數
{
assert(!IsEmpty());
JobRequest *min = front;
JobRequest *pre = front;
JobRequest *p = front;
JobRequest temp; //定義一個局部對象
while(p->next) //找現有隊列中優先級最高的,指針pre指向它的前驅
{
if(p->next->staffPerson <= min->staffPerson)
{
min = p->next;
pre = p;
}
p = p->next;
}
temp = *min; //將找到的優先級最高的對象付給臨時對象
pre->next = min->next; //從鏈式隊列中拆除
if(min == front) //如果值最小的節點是front此時min指向的位置是front->next;
//此時應delete front所指向的節點
{
delete front;
front = NULL;
}
else //否則釋放min所指向的節點
{
delete min; //釋放內存
min = NULL; //重要
}
return temp; //返回臨時對象給調用者後析構
}
bool IsEmpty()
{
if(front == NULL)
return true;
else
return false;
}
~PQueue() //順次釋放
{
JobRequest *p;
while(front != NULL)
{
p = front;
front = front->next;
delete p;
}
}
};
main()
{
PQueue myQueue; //實例化一個優先級隊列的對象
myQueue.EnQueue(Worker, 1, 2); //依次加入優先級隊列
myQueue.EnQueue(Supervisor, 2, 4);
myQueue.EnQueue(Manager, 3, 3);
myQueue.EnQueue(Manager, 4, 7);
myQueue.EnQueue(Worker, 5, 5);
myQueue.EnQueue(Supervisor, 6, 4);
myQueue.EnQueue(Supervisor, 7, 6);
int JobServices[3] = {0, 0, 0}; //一個記錄時間的數組
JobRequest s;
JobRequest *p;
cout<<"服務程序啓動......." <<endl;
cout<<"Manager(0) Supervisor(1) Worker(2)"<<endl;
while(!myQueue.IsEmpty()) //如果隊列非空的話就選擇優先級高的出隊列
{
s=myQueue.DeQueue();
p=&s;
switch(p->staffPerson) //根據需要服務的對象計算出一類人被服務的總時間
{
case 0 : JobServices[0] += p->jobTime; break;
case 1 : JobServices[1] += p->jobTime; break;
case 2 : JobServices[2] += p->jobTime; break;
default : cout<<"error!"<<endl;
}
cout<<p->staffPerson<<" User'ID:"<<p->jobID<<endl;
}
cout<<"累計時間如下:" <<endl;
cout <<"Manager:" <<"Usedtime:" <<JobServices[0]<<endl;
cout <<"Supervisor:" <<"Usedtime:" <<JobServices[1]<<endl;
cout <<"Worker:" <<"Usedtime:" <<JobServices[2]<<endl;
}