⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asdf.cpp

📁 用C++语言描述的数据结构方法
💻 CPP
字号:
#include   <queue>   
  #include   <list>   
  #include   <iostream>   
  #include   <ctime>   
  #include   <cstdlib>   
    
  using   namespace   std;   
    
  //事件类   
  class   event   
  {   
  public:   
  event()   {   }   
  event(int   a,bool   b,int   c,int   d,int   e,event   *p=NULL)   
    :time(a),lable(b),durtime(c),intertime(d),money(e),next(p)   
    {   }   
  event(const   event&   e)   
  {   
  time=e.rtime();   
                  lable=e.rlable();   
  durtime=e.rdurtime();   
  intertime=e.rintertime();   
  money=e.rmoney();   
  next=e.rnext();   
  }   
    
  ~event()   
  {   
  delete   next;   
  }   
    
  event&   operator=(const   event   &e)//重载赋值操作符   
  {   
  time=e.rtime();   
                  lable=e.rlable();   
  durtime=e.rdurtime();   
  intertime=e.rintertime();   
  money=e.rmoney();   
  next=e.rnext();   
  return   *this;   
  }   
    
  void   do_lable(bool   x)   
  {   
  lable=x;   
  }   
    
  void   do_time(int   x)   
  {   
  time=x;   
  }   
    
  int   rtime()const     
  {   
  return   time;   
  }   
    
  bool   rlable()const     
  {   
  return   lable;   
  }   
  int   rdurtime()const     
  {   
  return   durtime;   
  }   
    
  int   rintertime()const   
  {   
  return   intertime;   
  }   
    
  int   rmoney()const   
  {   
  return   money;   
  }   
    
  event*   rnext()   const   
  {   
  return   next;   
  }   
    
  bool   operator==(const   event   &e)   
  {   
  return( (durtime==e.rdurtime())&&(intertime==e.rintertime())&&(money==e.rmoney()));   
  }   
    
  bool   operator<=(const   event   &e)   
  {   
  return( (durtime<=e.rdurtime())&&(intertime<=e.rintertime())&&(money<=e.rmoney()));   
  }   
    
  private:   
  int   time; //如果为到达事件则表示到达时间,如果为离开事件则表示离开时间   
  bool   lable; //true表示客户到达事件,false表示客户离开事件   
  int   durtime; //办理事务所需时间   
  int   intertime; //下一客户即将到达的时间间隔   
  int   money; //钱数:正数则为存钱,负数则为取钱   
  event   *next;   
  };   
    
  void   bank_simulation();   
    
  list<event>   event_list;//事件表   
    
  list<event>   q1,q2;//客户队列   
    
  int   time1,durtime,intertime,money;   
    
  double   bank_time=0,   close_time=600,   bank_money=10000,   total_time=0;//银行的工作时间   
    
  double   number=0;//所有进入银行的客户数量   
    
  event   temp,data;//上一个产生的结点   
    
  list<event>::iterator   p   =   event_list.begin();   
    
  int   up_durtime,down_durtime,up_intertime,down_intertime,up_money,down_money;   
    
  event   create_node()   
  {   
  time1   =   temp.rtime()   +   temp.rintertime();   
  durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;   
  intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;   
  money=rand()%(up_money-down_money+1)+down_money;   
  event   e(time1,1,durtime,intertime,money);   
  return   e;   
  }   
    
  void   customer_arrived()//处理客户到达事件   
  {   
  q1.push_back(event_list.front());//将新到达的客户插入到第一个队列里   
  cout   <<   "     客户到达:     时间:   "   <<event_list.front().rtime()   
              <<   "     办理所需时间:   "   <<event_list.front().rdurtime()   
            <<   "     与下一个客户的时间间隔:   "   <<event_list.front().rintertime()     
            <<   "     钱数"<<event_list.front().rmoney()   
            <<   endl;   
    
    temp   =   create_node();   
  event_list.push_back(temp);   
  number   +=   1;//客户数量加1   
    
  int   i   =   0;//标记是否有客户正在处理   
  p   =   event_list.begin();   
  while   (p   !=   event_list.end())   
  {   
  if   (p   ->   rlable())   {   
  p++;   
  }   else   {   
  i=1;   
  break;   
  }   
  }   
  bank_time   =   event_list.front().rtime();   
      if   (!q1.empty()   &&   (0   ==   i))//如果第一个队列不为空而且在时间表中没有找到离开事件说明队头客户是刚进入银行的则处理之   
  {   
  data   =   q1.front();   
  if   (bank_money   +   data.rmoney()   >=   0)//银行余额足够则处理   
  {   
  data.do_time(bank_time+data.rdurtime());   
  data.do_lable(false);   
    
  p   =   event_list.begin();   
  while   (p   !=   event_list.end())   
  {   
  if   (p->rtime()   <   data.rtime())   {   
  p++;   
  }   else   {   
  break;   
  }   
  }   
    
  event_list.insert(p,   data);//生成离开事件并插入事件表   
  }   
  else   
  {   
  q2.push_back(q1.front());   
  q1.pop_front();   
  }   
  }   
  }   
  void   customer_departure()//处理客户离开事件   
  {   
  if   (!q1.empty()   &&   q1.front()   ==   event_list.front())//删除即将离开的客户,并计算其停留时间   
  {   
  cout   <<   "     客户离开     时间:"   <<   event_list.front().rtime()   
            <<   "     办理所需时间:"   <<   event_list.front().rdurtime()   
            <<   "     与下一个客户的时间间隔:"   <<   event_list.front().rintertime()   
                <<   "     钱数"   <<   event_list.front().rmoney()   
                    <<   endl;   
          bank_money+=event_list.front().rmoney();   
  total_time   +=   event_list.front().rtime()-q1.front().rtime();   
  bank_time     =   event_list.front().rtime();   
    
                  q1.pop_front();   
  }   
  else     
  {         
          cout   <<   "     客户离开     时间:"   <<   event_list.front().rtime()   
          <<   "     办理所需时间:"   <<   event_list.front().rdurtime()   
    <<   "     与下一个客户的时间间隔:"   <<   event_list.front().rintertime()   
        <<   "     钱数"   <<   event_list.front().rmoney()   
            <<   endl;   
          bank_money+=event_list.front().rmoney();   
  total_time   +=   event_list.front().rtime()-   q2.front().rtime();   
  bank_time     =   event_list.front().rtime();   
                    
                    q2.pop_front();   
    }   
            
            
        if   ((event_list.front().rmoney()   >   0   )&&   !q2.empty())   //每处理完一个存钱客户就要遍历第二个队列,处理所有满足办理条件的客户   
          {   
  p   =   q2.begin();   
  while   (p   !=   q2.end())//遍历第二个队列   
  {   
                          if   ((p->rmoney()   +   bank_money)   >   0)   
                          {   
  data   =   *p;   
          data.do_time(bank_time+data.rdurtime());   
          data.do_lable(false);   
            
  list<event>::iterator   q   =   event_list.begin();   
          while   (q   !=   event_list.end())   
  {   
          if   (q->rtime()   <   data.rtime())   
        q++;   
          else   
        break;   
  }   
      event_list.insert(q,   data);//生成离开事件,并插入事件表   
  }   
          p++;   
  }   
  }   
  }   
    
  void   bank_simulation()//银行业务模拟函数   
  {   
  srand(time(0));//随机数发生器(用系统时间作为种子)   
  durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;   
  intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;   
  money=rand()%(up_money-down_money+1)+down_money;   
  event   e(0,1,durtime,intertime,money,0);//生成第一个到达事件   
  event_list.push_back(e);//插入事件表   
  temp=e;   
    
  while((bank_time   <   close_time)&&(event_list.front().rtime()<close_time))   
  {   
  if(event_list.front().rlable())   
  customer_arrived();//处理到达事件   
    
  else   
  customer_departure();//处理离开事件   
  event_list.pop_front();   
    
  }   
  cout<<"银行关闭时间到了,所有客户马上离开,下面是客户相关的数据"<<endl;   
  p=q1.begin();   
  while   (p   !=   q1.end())//处理到达银行关闭时间,在银行里没有被接待的客户所停留的时间   
  {   
  total_time   +=   close_time   -   p->rtime();   
  cout   <<   "     客户的到达银行的时间为:"   <<p->rtime()<<   "     办理所需时间:"   <<   p->rdurtime()   
          <<   "     与下一个客户的时间间隔:"   <<   p->rintertime()   
              <<   "     钱数"   <<   p->rmoney()<<   endl;   
  p++;   
  }   
    
  p=q2.begin();   
  while   (p   !=   q2.end())   
  {   
          cout   <<   "     客户的到达银行的时间为:"   <<p->rtime()<<   "     办理所需时间:"   <<   p->rdurtime()   
          <<   "     与下一个客户的时间间隔:"   <<   p->rintertime()   
              <<   "     钱数"   <<   p->rmoney()<<   endl;   
  total_time   +=   close_time   -   p->rtime();   
  p++;   
  }   
  }   
    
  int   main(int   argc,   char   **argv)   
  {   
  cout<<"请输入初始时银行现存资金总额"<<endl;   
  cin>>bank_money;   
  cout<<"请输入银行总的工作时间"<<endl;   
  cin>>close_time;   
  cout<<"请分别输入客户交易时间,与下一个到达客户的时间间隔,钱数(正数代表存钱,负数代表取钱)的上下界"<<endl;   
  cin>>up_durtime>>down_durtime>>up_intertime>>down_intertime>>up_money>>down_money;   
          if((up_durtime<down_durtime)||(up_intertime<down_intertime)||(up_money<down_money))   
  cerr<<"输入错误:   上界一定要大于或等于下界"<<endl;   
  bank_simulation();   
  cout   <<   "客户平局停留时间:   "   <<   total_time   /   number   <<   endl;   
  system("PAUSE");   
  return   0;   
  }   
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -