停车场管理--这是中南大学计算机系数据结构课程设计里面的一道题
1.问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
2. 基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。
3.实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 |
#include stdio.h typedef struct Car { //结构体:车辆Car int number; int inTime; int outTime; }Car; typedef Car User; //用户自定义类型 #define FEIYONG 0.05 //停车费用单价 #define MAXSIZE 2 //停车场容量 //--------------系统库函数------------------ #include "stdlib.h" //--------------通用变量、常量、类型声明------------------ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef User SElemType; //---------------存储表示--------------------- #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; //---------------函数原型--------------------- //Status InitStack(SqStack &S); //构造空栈 //Status DestroyStack(SqStack &S); //销毁栈S //Status ClearStack(SqStack &S); //置空 //Status StackEmpty(SqStack S); //判空;空:TRUE,不空:FALSE。 //int StackLength(SqStack S); //返回S的元素的个数,即栈的长度。 //Status GetTop(SqStack S,SElemType &e); //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR。 //Status Push(SqStack &S,SElemType e); //插入元素e为新的栈顶元素 //Status Pop(SqStack &S,SElemType &e); //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。 //Status StackTraverse(SqStack S,Status ( * visit)()); //从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败。 //---------------基本操作--------------------- Status InitStack(SqStack &S) { //构造空栈 S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }//InitStack Status DestroyStack(SqStack &S){ //销毁栈S free(S.base); return OK; }//DestroyStack Status ClearStack(SqStack &S){ //置空 return OK; }//ClearStack //Status ClearStack(SqStack &S); //置空 Status StackEmpty(SqStack S){ //判空;空:TRUE,不空:FALSE。 if(S.top == S.base) return TRUE; else return FALSE; }//QueueEmpty int StackLength(SqStack S){ //返回S的元素的个数,即栈的长度。 return S.top - S.base; } Status GetTop(SqStack S,SElemType &e){ //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR。 if(S.top == S.base) return ERROR; e = *(S.top-1); return OK; }//GetTop Status Push(SqStack &S,SElemType e){ //插入元素e为新的栈顶元素 if(S.top - S.base >= S.stacksize){//栈满,追加存储空间 S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType)); if(!S.base) exit(OVERFLOW);//存储分配失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; }//Push Status Pop(SqStack &S,SElemType &e){ //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。 if(S.top == S.base) return ERROR; e = * --S.top; return OK; }//Pop Status StackTraverse(SqStack S){//,Status ( * visit)()){ //从栈底到栈顶依次对栈S中每个元素调用函数visit()。一旦visit()失败,则操作失败。 for(SElemType *p = S.base; p < S.top; p++) printf("%d\n",p->number); return OK; }//StackTraverse typedef int Status; typedef User QElemType; //---------------存储表示--------------------- typedef struct QNode { QElemType data; struct QNode *next; }QNode, *QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; //---------------函数原型--------------------- //Status InitQueue(LinkQueue &Q); //构造空队列Q //Status DestroyQueue(LinkQueue &Q); //销毁队列Q //Status ClearQueue(LinkQueue &Q); //置空 //Status QueueEmpty(LinkQueue Q); //判空;空:TRUE,不空:FALSE。 //int QueueLength(LinkQueue Q); //返回S的元素的个数,即队列的长度。 //Status GetHead(LinkQueue Q,QElemType &e); //若队列不空,则用e返回S的队头元素,并返回OK;否则返回ERROR。 //Status EnQueue(LinkQueue &Q,QElemType e); //插入元素e为新的队尾元素 //Status DeQueue(LinkQueue &Q,QElemType &e); //若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR。 //Status QueueTraverse(LinkQueue Q,Status ( * visit)()); //从队头到队尾依次对队列Q中每个元素调用函数visit()。一旦visit()失败,则操作失败。 //---------------基本操作--------------------- Status InitQueue(LinkQueue &Q){ //构造空队列Q Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next = NULL; return OK; }//InitQueue Status DestroyQueue(LinkQueue &Q){ //销毁队列Q while(Q.front) { Q.rear = Q.front->next; free(Q.front); Q.front = Q.rear; } return OK; }//DestroyQueue //Status ClearQueue(LinkQueue &Q); //置空 Status QueueEmpty(LinkQueue Q){ //判空;空:TRUE,不空:FALSE。 if(Q.front == Q.rear) return TRUE; else return FALSE; }//QueueEmpty //int QueueLength(LinkQueue Q); //返回Q的元素的个数,即队列的长度。 Status GetHead(LinkQueue Q,QElemType &e){ //若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。 if(Q.front == Q.rear) return ERROR; e = Q.front->next->data; return OK; }//GetHead Status EnQueue(LinkQueue &Q,QElemType e){ //插入元素e为新的队尾元素 QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return OK; }//EnQueue Status DeQueue(LinkQueue &Q,QElemType &e){ //若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR。 QueuePtr p; if(Q.front == Q.rear) return ERROR; p = Q.front->next; e = p->data; Q.front->next = p->next; if(Q.rear == p) Q.rear = Q.front; free(p); return OK; }//DeQueue Status QueueTraverse(LinkQueue Q){//,Status ( * visit)()){ //从队头到队尾依次对队列Q中每个元素调用函数visit()。一旦visit()失败,则操作失败。 for(QueuePtr p = Q.front->next; p !=NULL; p = p->next) printf("%d\n",p->data.number); return OK; }//QueueTraverse //函数声明部分 void Welcome(); //主选项画面 void GoIn(); //进场部分 int GoOut(); //出场部分 void LookChang(); //查看停车场部分 void LookDao(); //查看便道部分 void LookCopyRight();//查看版权信息 //全局变量声明 SqStack S1,S2; //S1为停车场,S2为暂存的地方 LinkQueue Q; //Q为便道 void Welcome(){ //主选项画面 //clrscr(); printf("\t1. 车 辆 到 达 2. 车 辆 离 去 \n"); printf("\t3. 查 看 停 车 场 内 情 况 4. 查 看 便 道 情 况 \n"); printf("\t5. 退 出\n\n"); printf("\t请输入1~5之间的数字选择相应功能:"); }//Welcome void GoIn(){ //进场部分 Car e; printf("您选择的是 1.车 辆 到 达\n"); printf("请输入车牌号:"); scanf("%d",&e.number); printf("请输入到达时间:"); scanf("%d",&e.inTime); int i = StackLength(S1); if(i >= MAXSIZE){ //停车场内已满,车辆在便道等待 printf("\n★停车场内已满,该车已在在便道内等待!\n\n"); EnQueue(Q,e); }else{ //停车场没满,车辆进入 Push(S1,e); printf("\n★车辆%d已于%d时%d分停放在第%d位。\n\n", e.number,e.inTime/100,e.inTime-e.inTime/100*100,i+1); //e.inTime / 100 为车辆进入停车场的时间(小时) //e.inTime - e.inTime / 100 * 100 为车辆进入停车场的时间(分钟) //i+1 为停车位 } }//GoIn int GoOut(){ //出场部分 int CarNum; //车号 SElemType *CarID; //车辆在停车场中的位置,指向停车场栈的基址指针 printf("\n您选择的是 2.车辆离去\n"); if(StackEmpty(S1) == TRUE) printf("★停车场内没有车辆!\n\n"); //看停车场内是否有车 else{ //车辆离开 printf("请输入要离开的车辆的车牌号:"); scanf("%d",&CarNum); for(CarID = S1.base; CarID < S1.top; CarID++) //遍历,检查输入的车号 if(CarID->number == CarNum) break; if(CarID == S1.top) //没有这辆车 printf("对不起,没有这辆车!请检查您输入的车号:%d\n\n",CarNum); else //找到这辆车了,让其离开停车场 { printf("★车辆%d进入停车场的时间是:%d",CarID->number,CarID->inTime); printf("\n请输入车辆离开的时间:"); scanf("%d",&CarID->outTime); if(CarID->outTime <= CarID->inTime) { printf("\n★时间不正确,离开时间居然会早于到达时间?!请从新输入\n\n"); return 0; } //计算费用,输出费用 int hh1,hh2,mm1,mm2,hh,mm; float money; //停车金额 hh1 = CarID->inTime / 100; mm1 = CarID->inTime - hh1 * 100; hh2 = CarID->outTime / 100; mm2 = CarID->outTime - hh2 * 100; if(mm2 - mm1 <0) { hh2--; mm2+=60; } hh = hh2 - hh1; mm = mm2 - mm1; money = (float)((hh * 60 + mm) * FEIYONG); ////费用四舍五入 printf("★您本次的停车费用为 %2.1f 元。谢谢使用。\n\n", money); //车辆出栈(该车后面的车先出栈并入栈S2暂存) SElemType e; Pop(S1,e); while(e.number != CarID->number || e.inTime != CarID->inTime) { Push(S2,e); Pop(S1,e); } while(!StackEmpty(S2)) { Pop(S2,e); Push(S1,e); } //检查便道中是否有车辆,有的话第一辆车出队列并入栈S1 if(!QueueEmpty(Q)) { DeQueue(Q,e); e.inTime = hh2 * 100 + mm2; Push(S1,e); //显示提示:便道中的车进入停车场 printf("★便道中的第一辆车%d于%d时%d分进入停车场!\n\n",e.number,hh2,mm2); } } } return 0; }//GoOut void LookChang(){ //查看停车场部分 printf("\n您选择的是 3.查看停车场内情况\n"); printf("★停车场内情况如下:\n"); StackTraverse(S1); printf("\n"); }//LookChang void LookDao(){ //查看便道部分 printf("\n您选择的是 4.查看便道情况\n"); printf("★便道内情况如下:\n"); QueueTraverse(Q); printf("\n"); }//LookDao int main(){ //主函数 printf(" \t 中 南 大 学 \n"); printf(" \t --------------------------------- \n"); printf(" \t 停 车 场 管 理 系 统 \n"); printf(" \t --------------------------------- \n"); printf(" \t 班级:物联网**班 \n"); printf(" \t ---------------------------------\n"); printf(" \t 姓名: *** 学号: *** \n"); printf(" \t ---------------------------------\n"); system("color 3E"); InitStack(S1); //初始化S1 InitStack(S2); //初始化S2 InitQueue(Q); //初始化Q while(1){ Welcome(); char i = getchar(); //获取按键(主菜单) if(i == 10) i = getchar(); //清空字符缓冲区 char i2 = getchar(); while(i2 != 10) i2 = getchar(); //清空字符缓冲区 switch(i){ case '1': //选择进场 GoIn();break; case '2': //选择出场 GoOut();break; case '3': //选择查看场内情况 LookChang();break; case '4': //选择查看便道情况 LookDao();break; case '5': //退出 printf("程序已退出!谢谢使用!\n\n"); exit(0); break; default: //其它 printf("您必须选择1~5之间的数字!\n"); } }//while(1) DestroyStack(S1); DestroyStack(S2); DestroyQueue(Q); return 0; } |
文章评论