关于“停车场问题”所做的总结

   数据结构第二次上机作业。“停车场问题”

 主要考察问题:

      栈:

        初始化栈

        判断栈满

        入栈

        出栈

      队列:

        初始化链队列

        判断链队列是否为空

        链队列入队

        链队列出队

总结细节问题:

   string函数只能在C++函数中使用;

   使用时要包含头文件#include<iostream>  

            #include<string>

   要使用栈或者队列,用之前必须初始化栈或者队列;

   在定义一个指针时,必须给他一个空间;

以下是源代码:

 

  1 #include <stdio.h>
  2 #include <malloc.h>
  3 #include <string>
  4 #include <iostream>
  5 
  6 using namespace std;
  7 
  8 #define MAX 2
  9 #define TRUE 1
 10 #define FALSE 0
 11 
 12 /******************************************/
 13 /************** 结构体定义 ****************/
 14 /******************************************/
 15 
 16 typedef struct          //车辆信息结构体
 17 {
 18     string number;         //车牌号码
 19     int time;            //到达时刻
 20 }Car;
 21 
 22 typedef struct                   //顺序栈定义
 23 {
 24     Car elem[MAX];      //车辆信息结构体指针       //////////////
 25     int top;
 26 }SeqStack;
 27 
 28 typedef struct Node        //链队列定义
 29 {
 30     Car data;             //车辆信息域
 31     struct Node *Next;       //指针域
 32 }LinkQueueNode;
 33 
 34 typedef struct
 35 {
 36     LinkQueueNode *front;
 37     LinkQueueNode *rear;
 38 }LinkQueue;
 39 
 40 SeqStack garage;//车库
 41 SeqStack quit;//暂退车道
 42 LinkQueue thendrive;//便车道
 43 
 44 /**********************************************/
 45 /***************** 函数声明 *******************/           
 46 /**********************************************/
 47 
 48 void InitStack(SeqStack *s);//初始化顺序栈
 49 int IsEmpty(SeqStack *s);//判断栈满函数
 50 int Push(SeqStack *s,int e);//入栈
 51 int Pop(SeqStack *s,int *e);//出栈
 52 
 53 
 54 void InitStack(SeqStack *s)
 55 {
 56     s->top=-1;    
 57 }
 58 
 59 int IsEmpty(SeqStack *s)
 60 {
 61     if(s->top==-1)
 62         return TRUE;
 63     else 
 64         return FALSE;
 65 }
 66 
 67 int Push(SeqStack *s,string number,int time)
 68 {
 69     if(s->top>=2)
 70         return FALSE;
 71     else
 72     {
 73         s->top++;
 74         s->elem[s->top].number=number;
 75         s->elem[s->top].time=time;
 76     }
 77     return TRUE;
 78 }
 79 
 80 int Pop(SeqStack *s,Car *e)
 81 {
 82     if(s->top==-1)
 83         return FALSE;
 84     else
 85     {
 86         e->number=s->elem[s->top].number;
 87         e->time=s->elem[s->top].time;
 88         s->top--;
 89         return TRUE;
 90     }
 91 }
 92 
 93 
 94 int InitQueue(LinkQueue *Q);
 95 int EmptyQueue(LinkQueue Q);
 96 int EnterQueue(LinkQueue *Q,string number,int time);
 97 int DeleteQueue(LinkQueue *Q,Car *x);
 98 
 99 int InitQueue(LinkQueue *Q)        //链队列初始化
100 {
101     Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
102     if(Q->front!=NULL)
103     {
104         Q->rear=Q->front;
105         Q->front->Next=NULL;
106         return TRUE;
107     }
108     else 
109         return FALSE;
110 }
111 
112 int EmptyQueue(LinkQueue *Q)     //判断链队列是否为空
113 {
114     if(Q->front==Q->rear)
115         return TRUE;
116     else
117         return FALSE;
118 }
119 
120 int EnterQueue(LinkQueue *Q,string number,int time)        //链队列入队操作
121 {
122     LinkQueueNode *NewNode;
123     NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
124     if(NewNode!=NULL)
125     {
126         NewNode->data.number=number;
127         NewNode->data.time=time;
128         NewNode->Next=NULL;
129         Q->rear->Next=NewNode;
130         Q->rear=NewNode;
131         return TRUE;
132     }
133     else
134         return FALSE;        //溢出
135 }
136 
137 int DeleteQueue(LinkQueue *Q,Car *x)        //链队列出队操作
138 {
139     LinkQueueNode *p;
140     if(Q->front==Q->rear)
141         return FALSE;
142     p=Q->front->Next;
143     Q->front->Next=p->Next;
144     if(Q->rear==p)
145         Q->rear=Q->front;
146     (*x)=p->data;
147     free(p);
148     return TRUE;
149 }
150 
151 /**********************************************/
152 void Come(string Number,int Time);//车辆到达函数
153 void Leave(string Number,int Time);//车辆离开函数
154 
155 void Come(string Number,int ComeTime)
156 {
157     if(garage.top<2)
158     {
159         Push(&garage,Number,ComeTime);
160     }
161     else
162     {
163         EnterQueue(&thendrive,Number,ComeTime);
164     }
165     cout<<Number<<"当前停放在车库"<<garage.top+1<<endl;
166 }
167 
168 void Leave(string Number,int LeaveTime)
169 {
170     Car *e=new(Car);    
171     int cost;//停车费用
172     while((!IsEmpty(&garage))&&((garage.elem[garage.top].number)!=Number))//当"车库"栈不空,并且栈顶车辆不是要离开的车
173     {    
174         Pop(&garage,e);//将"车库"栈的栈顶车辆退出
175         Push(&quit,e->number,e->time);//让退出的车辆进入"暂时退车道"栈
176     }
177     Pop(&garage,e);
178     cost=(LeaveTime-e->time)*5;
179     //将"暂时退车道"栈中的车辆倒回"车库"栈
180     while(!IsEmpty(&quit))
181     {
182         Pop(&quit,e);
183         Push(&garage,e->number,e->time);
184     }
185     if(!EmptyQueue(&thendrive))
186     {
187         DeleteQueue(&thendrive,e);//队头车辆出队
188         e->number=LeaveTime;
189         Push(&garage,e->number,e->time);
190     }
191     cout<<Number<<"停放时间为"<<LeaveTime-e->time<<"停车费用为"<<cost<<""<<endl;
192 }
193 
194 void main ()
195 {    
196     int A;
197     string Number;
198     int Time;
199     InitStack(&garage);
200     InitStack(&quit);
201     InitQueue(&thendrive);
202     printf("请输入车辆信息(到达/离开,牌照号码,当前时刻):");
203     cin>>A;
204     while(A!=-1)
205     {
206         
207         cin>>Number>>Time;
208         if(A==1)
209         {
210             Come(Number,Time);
211         }
212         else
213             Leave(Number,Time);
214         cin>>A;
215     }
216 
217 
218 }

 

 

 

 

 

 

 

 

 

 

        

posted @ 2015-11-03 23:49  shunyu  阅读(488)  评论(0编辑  收藏  举报