#include typedef struct car // 车辆信息 { char ch[64]; // 车牌号 char dt[16]; // 到达时间 char jt[16]; // 进入停车场(开始计费)时间 char lt[16]; // 离开时间 } TCAR, *LPT; typedef struct carstack { LPT lpCar; // 车辆信息 int nTop; // 栈顶元素下标 int M; // 栈容量 } TSTACK, *LPTSTACK; // 初始化栈 CS, 将其容量设置为 Size void StackInit( LPTSTACK &CS, int Size ) { CS = ( LPTSTACK ) malloc( sizeof ( TSTACK ) ); CS->lpCar = ( LPT ) malloc(Size * sizeof ( TCAR )); CS->nTop = -1; CS->M = Size; } // 车辆信息 cx 入栈 CS void Push( LPTSTACK &CS, TCAR cx ) { CS->nTop++; CS->lpCar[CS->nTop] = cx; } // 车辆信息从栈 CS 中弹出并存入 cx void Pop( LPTSTACK &CS, TCAR &cx) { cx = CS->lpCar[CS->nTop]; CS->nTop--; } // 若栈 CS 空,返回 TRUE;否则,返回 FALSE BOOL IsStackEmpty( LPTSTACK CS ) { return CS->nTop == -1; } // 若栈 lpStackFull 满,返回 TRUE;否则,返回 FALSE BOOL IsStackFull( LPTSTACK CS ) { return CS->nTop == ( CS->M - 1 ); } // 销毁栈 CS,将指针 CS 置为 NULL void DestroyStack( LPTSTACK &CS ) { free( CS->lpCar ); free( CS ); CS = NULL; } typedef struct carnode // 链队结点信息 { TCAR cx; // 车辆信息 struct carnode *Next; // 指向下一个元素的指针 } TNODE, *LPTNODE; typedef struct carqueue // 链队 { LPTNODE Head; // 头结点 LPTNODE Rear; // 指向当前队尾的指针 int size; // 当前队中元素个数 } TQUEUE, *LPTQUEUE; // 初始化链队 CQ void InitQueue( LPTQUEUE &CQ ) { CQ = ( LPTQUEUE ) malloc( sizeof( TQUEUE ) ); //生成头结点 CQ->Head = ( LPTNODE) malloc( sizeof( TNODE ) ); CQ->Head->Next = NULL; CQ->Rear = CQ->Head; CQ->size = 0; } // 车辆信息 cx 入队 CQ void AddQueue( LPTQUEUE &CQ, TCAR cx ) { LPTNODE CN = ( LPTNODE ) malloc( sizeof(carnode) ); //生成新结点,并有CN指向它 CN->cx = cx; CN->Next = NULL; CQ->Rear->Next = CN; CQ->Rear = CQ->Rear->Next; CQ->size++; } // 队头元素从链队 CQ 中出队并存入 cx void DeQueue( LPTQUEUE &CQ, TCAR &cx ) { LPTNODE t = CQ->Head->Next; cx = t->cx; CQ->Head->Next = t->Next; free( t ); CQ->size--; } // 若链队 CQ 为空,返回 TRUE;否则,返回 FALSE BOOL IsQueueEmpty( LPTQUEUE CQ ) { return CQ->size == 0; } // 销毁链队 CQ void DestroyQueue( LPTQUEUE &CQ ) { LPTNODE NextCN= NULL; //空结点 for ( LPTNODE CN = CQ->Head; CN != NULL; CN = NextCN ) { NextCN = CN->Next; free( CN ); } free( CQ ); CQ = NULL; } // 将字符串时间格式转换为数字(分钟)格式,例如 12:36 将被转换为 756 ( 12 * 60 + 36 ) int TFormat( char *Time ) { int Hour = 0; int Minute = 0; sscanf( Time, \"%d:%d\ return Hour * 60 + Minute; } // 根据在停车场内的停留时间 times (分钟)计算费用 double Expense( int times ) { return times * ( 5.0 / 60 ); } int main( void ) { int MAX = 0; // 停车场容量 putchar( '\\n' ); printf(\"\\===========欢迎你进入停车场管理系统===========\\n\"); printf( \"请输入停车场容量:\" ); scanf( \"%d\ LPTSTACK CS= NULL; // 停车场,用栈模拟 StackInit( CS, MAX ); LPTQUEUE CQ = NULL; // 便道,用链队模拟 InitQueue( CQ ); char CType = NULL; // 命令类型 char Input[200] = { NULL }; // 用户输入 do { system( \"cls\" );//清空当前屏幕 puts( \"--------------------\" ); puts( \"[命令类型]\\nA - 车辆到达\\nD - 车辆离开\\nE - 停止输入\" ); puts( \"O - 显示当前停车场和便道使用情况\\n\" ); printf( \"请输入命令:\" ); scanf( \"%s\ puts( \"--------------------\" ); char Car[200] = { NULL }; sscanf( Input, // 将命令类型与车辆信息分开存放 \"%c,%s\ &CType, // 用户输入的前半部分,即命令类型 &Car // 用户输入的后半部分,即车辆信息 ); char *D = NULL; // 车辆信息字符串中的逗号位置 for ( D = Car; *D != '\\0'; D++ ) { if ( *D == ',' ) { break;} }*D = '\\0'; TCAR cx = { NULL }; // 存储本次用户输入的车辆信息 strcpy( cx.ch, Car ); if ( CType == 'A' ) { strcpy( cx.dt, D + 1 ); if ( FALSE == IsStackFull( CS ) ) { strcpy( cx.jt, cx.dt ); Push( CS, cx ); printf( \"已进入停车场第 %d 个车位\\n\ printf( \"车牌号:\\%s\\n\ printf( \"进入时间:\%s\\n\ puts( \"是否收费:\是\" ); } else { AddQueue( CQ, cx ); printf( \"停车场已满,已停放在便道的第 %d 个车位\\n\printf( \"车牌号:\\%s\\n\printf( \"停放时间:\%s\\n\ puts( \"是否收费:\否\" ); } } else if ( CType == 'D' ) { strcpy( cx.lt, D + 1 ); LPTSTACK tCS = NULL; StackInit( tCS, MAX ); TCAR cxOut = { NULL }; BOOL IsCarFound = FALSE; while ( FALSE == IsStackEmpty( CS) ) { Pop( CS, cxOut ); if ( 0 != strcmp( cxOut.ch, cx.ch ) ) { Push( tCS, cxOut ); } else { IsCarFound = TRUE; break; } } while ( FALSE == IsStackEmpty( tCS ) ) { TCAR tcx = { NULL }; Pop( tCS, tcx ); Push( CS, tcx ); } if ( FALSE == IsCarFound ) { printf( \"车牌号为 %s 的车未进入停车场.\\n\ printf( \"--------------------\\n按任意键输入下一条信息...\\n\" );getch(); continue; } strcpy( cxOut.lt, cx.lt ); int njt = TFormat( cxOut.jt ); int nlt = TFormat( cxOut.lt ); int times = nlt - njt; printf( \"计费时段:\%s - %s (共 %d 分钟)\\n\ double rExpense = Expense( times ); printf( \"应交纳的费用:\%.1lf 元\\n\ if ( FALSE == IsQueueEmpty( CQ ) ) { TCAR tcx = { NULL }; DeQueue( CQ, tcx ); strcpy( tcx.jt, cxOut.lt ); Push( CS, tcx ); puts( \"--------------------\\n\" ); printf( \"停放在便道的第 1 个车位,车牌号为 %s 的车已进入停车场\\n\ } } else if ( CType == 'E' ) { puts( \"=====谢谢使用,欢迎下次再来!=====\" ); break; } else if ( CType == 'O' ) { system( \"cls\" ); //清空当前屏幕 puts( \"[停车场使用情况]\\n\" ); puts( \"[车位]\[车牌号]\[到达时间]\[进入(开始计费)时间]\\n\"); for ( int i = 0; i <= CS->nTop; i++ ) { printf( \"%d\%s\\%s\\%s\\n\\n\ } //putchar( '' ); puts( \"[便道使用情况]\\n\" ); puts( \"[车位]\[车牌号]\[到达时间]\[进入(开始计费)时间]\\n\"); int nNum = 0; for ( LPTNODE CN = CQ->Head->Next;CN != NULL; CN =CN->Next ) { nNum++; printf( \"%d\%s\\%s\\%s\\n\ } putchar( '\\n' ); } else { puts( \"输入信息有误.第一个字符只能为 'A' 或 'D' 或 'E' 或 'O' (区分大小写).\" ); } printf( \"--------------------\\n按任意键输入下一条信息...\\n\" ); getch(); } while ( TRUE ); DestroyStack( CS ); DestroyQueue( CQ ); printf( \"\\n按任意键退出程序...\\n\"); getch(); return 0; }
因篇幅问题不能全部显示,请点此查看更多更全内容