当前位置:C++技术网 > 资讯 > C++模拟队列的源代码

C++模拟队列的源代码

更新时间:2015-06-26 20:55:44浏览次数:1+次

main函数文件代码test.cpp:

#include <iostream>
#include "qc.h"
bool newcustomer(double x);
#include <time.h>
void main()
{
    using namespace std;
    /*Item item1;
    Item item2;
    Item item3;
    Item item4;
    Item item5;*/

    //cout<<"当前客户到达的时间: "<<item1.when()<<endl;
    //cout<<"当前客户办理业务的时间: "<<item1.ptime()<<endl;
    /*Queue q;
    q.enqueue(item1);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.enqueue(item2);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.enqueue(item3);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.enqueue(item4);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.dequeue(item5);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.dequeue(item5);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.dequeue(item5);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.dequeue(item5);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;
    q.dequeue(item5);
    cout<<"当前队列长度: "<<q.queuecount()<<endl;*/
    srand(time(0));
    cout<<"请输入队列的最大长度: ";
    int maxqueue;
    cin>>maxqueue;
    Queue q(maxqueue);
    cout<<"请输入程序模拟的持续时间(单位为小时): ";
    int fortime;
    cin>>fortime;
    cout<<"请输入平均每小时的客户数: ";
    int cperh;
    cin>>cperh;
    int turnaway = 0; //队满时离开的客户
    int customer =0;  //排队了的客户
    int served = 0;   //处理过业务的客户
    int waittime = 0; //柜台等待时间
    Item temp;
    char ch;

    while(cout<<"输入q停止循环多次模拟!\n" && cin>>ch && 'q' != ch)
    {
	turnaway = 0; //队满时离开的客户
        customer =0;  //排队了的客户
        served = 0;   //处理过业务的客户
        waittime = 0; //柜台等待时间
        for(int i=0;i<fortime * 60;i++)
        {
            if(newcustomer(60/cperh))
            {
               if(q.isfull())
               {
	           //cout<<"队列满,不能排队!客户 "<<turnaway+1<<" 离开\n";
	           turnaway++;
	           cout<<"客户离开,当前队列长度: "<<q.queuecount()<<endl;
               }
               else
               {
	           //cout<<"客户 "<<customer+1<<" 排队中\n";
                   temp.set(i);
	           q.enqueue(temp);
	           cout<<"客户排队中,当前队列长度: "<<q.queuecount()<<endl;
	           customer++;
               }
            }
            if(waittime<=0 && !q.isempty())
            {
                q.dequeue(temp);
                waittime = temp.ptime();
                cout<<"客户 "<<served+1<<" 业务处理完毕,耗时 "<<waittime<<" 分钟.\n";
                cout<<"业务处理完毕,当前队列长度: "<<q.queuecount()<<endl;
                served++;
            }
            if(waittime>0)
            {
	        if(1==waittime)cout<<"客户"<<served+1<<"业务处理中...\n";
	        cout<<"业务处理中...,当前队列长度: "<<q.queuecount()<<endl;
	        waittime--;
            }
        }
        if(customer>0)
        {
            if(customer<served)cout<<"出错了!\n";
            else
            {
                cout<<"\n排队了的客户数: "<<customer<<endl;
	        cout<<"模拟结束后处理了业务的客户数: "<<served<<endl;
	        cout<<"没排上队离开的客户数: "<<turnaway<<endl;
            } 
		
        }
    }
}
bool newcustomer(double x)
{
    //x为客户到来的平均时间
    return (rand()*x /RAND_MAX <1);
}
	
	
队列模拟类头文件qc.h:

class Customer
{
    private:
    long arrive;//进入队列的时间
    int processtime;//服务处理的时间
    public:
    Customer(){arrive=processtime=0;}
    void set(long when);//设置处理时间
    long when()const{return arrive;}
    int ptime()const{return processtime;}
};

typedef Customer Item;

class Queue
{
    enum {Q_SIZE = 10};
    struct Node{Item item;struct Node * next;};
    private:
    Node * front;
    Node * rear;
    int curitem;//当前队列长度
    const int maxqsize;//队列最大长度

    public:
    Queue(int qs = Q_SIZE);
    ~Queue();
    bool isempty()const;
    bool isfull()const;
    int queuecount()const;
    bool enqueue(const Item & item);
    bool dequeue(Item & item);

};

队列模拟类源文件qc.cpp:

#include "qc.h"
#include <iostream>
#include <stdlib.h>

void Customer::set(long when)
{
    using namespace std;
    processtime = rand()%3+1;
    arrive = when;
}

Queue::Queue(int qs):maxqsize(qs)
{
    front = rear = NULL;
    curitem = 0;
}
Queue::~Queue()
{

}
bool Queue::isempty()const
{ 
    return curitem == 0;
}
bool Queue::isfull()const
{
    return curitem == maxqsize;
}
int Queue::queuecount()const
{
    return curitem;
}
bool Queue::enqueue(const Item & item)
{

    if(isfull())
    {
        std::cout<<"队列已满!入队失败\n";
        return false;
    }
    Node * p = new Node;
    if(!p)
    {
        std::cout<<"创建结点失败,入队失败!\n";
        return false;
    }
    using std::cout;
    p->item = item;
    p->next = NULL;
    if(!front)
        front = p;
    else
        rear->next = p;

    rear = p;
    curitem++;
    return true;
}
bool Queue::dequeue(Item & item)
{
    if(isempty())
    {
        std::cout<<"队列空!出队失败!\n";
        return false;
    }

    Node * p = front;
    if(front == rear)rear=NULL;
    front = p->next;
    item = p->item;

    delete p;
    curitem--;
    return true;
}
    如有疑问,请留言。