一个作业调度程序,采用的链式优先级队列

                      以前编的一个使用链式优先级队列的作业调度程序,也是比较简单的。
#include<iostream>
#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 
*= 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, 
12);             //依次加入优先级队列
    myQueue.EnQueue(Supervisor, 24);
    myQueue.EnQueue(Manager, 
33);
    myQueue.EnQueue(Manager, 
47);
    myQueue.EnQueue(Worker, 
55);
    myQueue.EnQueue(Supervisor, 
64);
    myQueue.EnQueue(Supervisor, 
76);

    
int JobServices[3= {000};             //一个记录时间的数组
    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;
    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章