一個作業調度程序,採用的鏈式優先級隊列

                      以前編的一個使用鏈式優先級隊列的作業調度程序,也是比較簡單的。
#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;
    
}

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