CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

栈和队列的使用实例,停车场管理系统的使用

楼主javcy(极度郁闷)2003-06-01 20:52:24 在 专题开发/技术/项目 / 数据结构与算法 提问

#include   <iostream.h>  
   
  const   int   N=3;       //停车场的长度  
  const   int   M=6;       //单位时间内停车场收费值  
  typedef   struct{  
                  int   num;       //车辆编号  
                  int   arrtime;       //到达或离开时间,停车场时间收费值按小时算  
                  }element;  
  struct   seqstack{  
  element   stack[N+1];  
  int   top;  
  }s1,s2;  
  struct   link{  
  element   data;  
  link   *next;  
  };  
  struct   queue{  
  link   *front,*rear;  
  }q;  
  seqstack   inistack(seqstack   s){         //栈的初始化  
  s.top=0;  
  return   s;  
  }  
  seqstack   push(seqstack   s,element   x)         //进栈  
  {  
  s.top++;  
  s.stack[s.top]=x;  
  return   s;  
  }  
  seqstack   pop(seqstack   s)           //退栈  
  {  
  s.top--;return   s;  
  }  
  element   gettop(seqstack   s)         //取栈顶元素  
  {  
  return   s.stack[s.top];  
  }  
  int   empty(seqstack   s)       //判栈空  
  {  
  if(s.top==0)     return   1;  
  else   return   0;  
  }  
  queue   iniqueue(queue   s)         //链队列初始化  
  {  
  link   *p;  
  p=new   link;  
  p->next=NULL;  
  s.front=s.rear=p;  
  return   s;  
  }  
  queue   inqueue(queue   s,element   x)         //进队  
  {  
  link   *p;  
  p=new   link;  
  p->data=x;  
  p->next=s.rear->next;  
  s.rear->next=p;  
  s.rear=p;  
  return   s;  
  }  
  queue   outqueue(queue   s)         //出队  
  {  
  link   *p=s.front;  
  s.front=p->next;  
  delete   p;  
  return   s;  
  }  
  element   gethead(queue   s)         //取队头元素  
  {  
  return   s.front->next->data;  
  }  
  int   emptyqueue(queue   s)  
  {  
  if(s.front==s.rear)   return   1;  
  else   return   0;  
  }  
   
  //处理车辆到达的情形  
  void   arrive(element   x)  
  {  
  //X为到达的车辆  
  if(s1.top==N)  
  q=inqueue(q,x);         //进入便道  
  else   s1=push(s1,x);         //进入停车场  
  }  
   
  //处理车辆离开的情形  
  void   live(element   x)  
  {  
  //X为离开的车辆  
  int   f=1;element   y;  
  link   *r;  
  while(!empty(s1)&&(f==1))     //在停车场中找要离开的车辆  
  if(s1.stack[s1.top].num!=x.num)  
  {   y=gettop(s1);     s1=pop(s1);   s2=push(s2,y);}  
  else{     f=0;y=gettop(s1);s1=pop(s1);  
  cout<<"停车场中有编号为"<<x.num<<"的车"<<endl;  
  cout<<"该车将离开,应收停车费:"<<(x.arrtime-y.arrtime)*M<<"元\n"<<endl;  
  while(!empty(s2))  
  {  
  y=gettop(s2);s2=pop(s2);s1=push(s1,y);  
  }  
  //停车场中离开一辆车后,便道上第一辆车进停车场  
   
  if(!emptyqueue(q)){  
  y=gethead(q);       //取队头元素  
  q=outqueue(q);       //出队  
  s1=push(s1,y);}     //进栈  
  }  
  if(empty(s1))       //停车场中无给定的车辆,则到便道上找  
  {    
  while(!empty(s2))  
  {  
  y=gettop(s2);  
  s2=pop(s2);  
  s1=push(s1,y);  
  }  
  if(!emptyqueue(q))  
  {  
  link   *p=q.front;  
  while((p!=NULL)&&(p->data.num!=x.num))  
  {  
  r=p;  
  p=p->next;  
  }  
  if(!emptyqueue(q))  
  {  
  link   *p=q.front;  
  while((p!=NULL)&&(p->data.num!=x.num))  
  {  
  r=p;  
  p=p->next;  
  }  
  if(p!=NULL)  
  {  
  cout<<"便道上有编号为"<<x.num<<"的车辆"<<endl;  
  cout<<"该车将离开,应收停车费0.00元:\n"<<endl;  
  r->next=p->next;delete   p;}  
  else  
  cout<<"便道上没有编号为"<<x.num<<"的车辆,输入的车辆不存在!!!\n"<<endl;  
  }  
  }  
  }  
  }  
  void   process1()         //输出停车场中的车辆编号和到达时间  
  {  
  int   t=s1.top;  
  cout<<"停车场中的车辆编号和到达时间"<<endl;  
  while(t!=0)  
  {  
  cout<<s1.stack[t].num<<"         "<<s1.stack[t].arrtime<<endl;  
  t--;  
  }  
  cout<<endl;  
  }  
   
  void   process2()     //输出便道中的车辆编号和到达时间  
  {  
  link   *p=q.front->next;  
  cout<<"便道中的车辆编号和到达时间"<<endl;  
  while(p!=NULL){  
  cout<<p->data.num<<"         "<<p->data.arrtime<<endl;  
  p=p->next;  
  }  
  cout<<endl;  
  }  
   
   
  void   main()  
  {  
  int   n;  
  element   x;  
  s1=inistack(s1);  
  s2=inistack(s2);  
  q=iniqueue(q);  
  while(1){  
   
  cout<<endl;  
  cout<<"请输入车辆编号,到达或离开的时间\n"  
  <<"[例如(8   8)   说明停车场时间收费值按小时算]"<<endl;  
  cin>>x.num>>x.arrtime;  
  cout<<"请选择处理车辆的事件\n"  
  <<"1)   到达   \n"  
  <<"2)   离开   \n"  
  <<"3)   结束   \n";  
   
  cin>>n;  
  if(n==1)  
  {  
  arrive(x);process1();process2();  
  }  
  else   if(n==2)   {live(x);process1();process2();}  
  else   break;  
  }  
  cout<<endl;  
  }  
  问题点数:1、回复次数:2Top

1 楼mmmcd(超超)回复于 2003-06-02 13:45:33 得分 0

有什么问题呢?Top

2 楼zest342(珊珊)回复于 2003-06-02 20:35:01 得分 1

自定义汽车信息数据类型:  
  struct   node  
  {char   mes;  
    int   carnumber   ,intime   ,outime   ;  
  };  
      自定义链表数据类型:  
   struct   queue_node  
  {nodelist   data;  
    struct   queue_node   *next   ;  
  };  
   
  基本操作:  
  addqueue(nodelist   value)  
  初始条件:队列已存在  
  操作结果:将value   插入到队尾  
   
  nodelist   delqueue()  
  初始条件:队列已存在  
  操作结果:删除队尾元素,并返回其值  
  主程序:  
  main()  
  {初始化;  
  输入数据;  
  while(p.mes!='E')  
    {   switch(p.mes)  
  {case   'A'   :入栈;  
        
  case   'D':出栈;  
  计算时间;}}  
   
  一.   详细设计  
  #define   n   5             //模似停车场栈的大小  
  #define   Null   0  
  struct   node             //汽车信息数据类型    
  {char   mes;  
    int   carnumber   ,intime   ,outime   ;  
  };  
  typedef   struct   node   nodelist   ;     //队列数据类型     
  struct   queue_node  
  {nodelist   data;  
    struct   queue_node   *next   ;  
  };  
  typedef   struct   queue_node   queue_list   ;  
  typedef   struct   queue_node   *link;  
  link   front   =Null;  
  link   rear   =Null;  
   
  status   addqueue(nodelist   value)  
  {  
    new_node=(link)malloc(sizeof(queue_list));  
    new_node->data=value;  
    new_node->next=Null;  
    if(rear==Null)  
      front=new_node;  
    else  
      rear->next   =new_node;  
      rear=new_node;  
  }  
   
  status   delqueue()  
  {   if(front!=Null)  
      {first=front;  
        front=front->next;  
        temp=first->data;  
        free(first);  
        return(temp);}  
   
  }  
   
  main()  
   
    index=-1;           //记录进入停车场的车辆数目    
    scanf("%c%d%d%d",&p.mes,&p.carnumber,&p.intime,&p.outime);  
    while(p.mes!='E')  
      {switch(p.mes)  
          {case   'A'   :  
              {if(top<n)                       //入栈  
                  {stack[top]=p;  
                      ++top;  
                      ++index;  
                    }  
                  else  
                      addqueue(p);   //如栈满则入队列  
                  }  
                  break;  
              case   'D':       //对应元素出栈  
                    {while(p.carnumber!=stack[k].carnumber)     
                              k++;  
                        q=stack[k];  
                        top=index;  
                        while(top>k)               
                          {stacktemp[toptemp]=stack[top];  
                              toptemp++;  
                              top--;}  
   
                        toptemp=index-k-1;  
                        top=k;  
                        while(toptemp>=0)  
                            {stack[top]=stacktemp[toptemp];  
                              top++;  
                              toptemp--;}  
   
   
                        q.outime=p.outime;      
                        result=q.outime-q.intime;  
        printf("%d",result);  
                          index--;  
      if(index+2==n   &&   front   !=Null)       //若栈内还有一个空间且队列非空,则将队列中头一个元素入栈,并修改队头元素的入栈时间  
  {   index++;  
  top=index;  
                                r=delqueue();  
                                stack[top]=r;}  
       
    }     }  
    scanf("%c%d%d%d",&p.mes,&p.carnumber,&p.intime,&p.outime);  
      }  
  }  
  Top

相关问题

  • 请问什么是树,队列,堆,栈
  • 请求栈以及队列的算法实现源程序c
  • 一个关于堆栈和队列的问题!
  • 请问在MFC中有队列或者栈的类吗?
  • 停车场计时问题:(急!!!)
  • 停车场收费记费问题====急!!!!
  • 停车场收费记费问题====急!!!!
  • 停车场收费记费问题====急!!!!
  • 停车场收费记费问题====急!!!!
  • 消息队列

关键词

  • top
  • null
  • seqstack
  • toptemp
  • outime
  • 队列
  • 停车场
  • rear
  • front
  • arrtime

得分解答快速导航

  • 帖主:javcy
  • zest342

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo