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

                      以前编的一个使用链式优先级队列的作业调度程序,也是比较简单的。
#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;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值