#if defined _MSC_VER && ! defined _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif // 针对vs的scanf调整
#include <stdio.h>
#include <stdlib.h>
#ifdef __linux__
#define CLEAR() system("clear")
#define SLEEP() printf("按回车键继续..."); ResetIn()
#else
#define CLEAR() system("cls")
#define SLEEP() system("pause")
#endif
#define N 3 // 停车场 可停放车数量
#define ResetIn() while (getchar() != '\n') {}
typedef struct Car { // 车
char ID[16]; //车牌号
int hour, min; // 进入时间 (小时:分钟)
} Car;
#define __list_t Car
#include "list.h"
void menu(); //菜单
int input_car(Car*); //输入car数据
int to_find(const Car*); Car *tf_car; //查找函数
int to_traverse(Car*); //遍历函数
int main()
{
int i;
Car _car, *car=&_car;
Car_list _stack, _queue, *stack=&_stack, *queue=&_queue; // 栈stack 队列queue
Car_list_init(stack); // 初始化栈
Car_list_init(queue); // 初始化队列
for (;;) {
CLEAR();
printf(" \n\n");
printf(" 停车场管理系统\n\n");
printf(" 欢 迎 进 入 停 车 场 管 理 系 统 !\n\n\n\n\n");
printf(" 停车场目前车辆停放情况如下:\n\n");
printf(" 停车场车的数量: %ld\n", stack->size(stack)); // 栈大小
stack->traverse(stack, to_traverse); // 遍历栈
printf(" 便道上车的数量: %ld\n\n", queue->size(queue)); // 队列大小
queue->traverse(queue, to_traverse); // 遍历队列
puts("");
menu();
if ( scanf(" %d", &i) != 1 ) {
ResetIn();
continue;
}
ResetIn();
switch ( i) {
case 1:
input_car(car);
if (stack->size(stack) < N) {
printf("\n 车辆已成功进入停车场!\n");
stack->push_back(stack, car); // 插入到栈
} else {
printf("\n 停车场已满,车将进入便道\n");
queue->push_back(queue, car); // 插入到队列
}
SLEEP();
break;
case 2:{
int time;
Car *car1;
Car_list *cars;
input_car(car);
tf_car = car;
cars = stack->find_if(stack, to_find); // 查找car
if ( ! cars->size(cars) ) {
printf("\n 未在停车场找到车牌号为[%s]的车\n", car->ID);
} else {
car1 = cars->begin(cars); // 取 [查找结果集] 中的第一个数据
Car_list_iterator it = stack->rbegin(stack); // 使it指向栈最后一个数据
while (it != stack->rend(stack)) { // 从后往前遍历栈
if (strcmp(car1->ID, it->ID) == 0)
break;
queue->push_back(queue, it); // 把数据插到队列末尾
printf("\n 车牌号为[%s]", it->ID);
it = stack->prev(stack, it); // it指向前一个数据
stack->pop_back(stack); // 删除栈最后一个数据
}
printf("的车暂时退出停车场,进入便道以让车。\n\n");
time = car->hour*60 + car->min;
time -= car1->hour*60 + car1->min;
printf(" 车牌号为[%s]的车已离开\n 停车时间:%d小时%d分钟\n 收费¥%d\n\n\n", car1->ID, time/60, time%60, time);
stack->pop_back(stack);
while ( queue->size(queue) && stack->size(stack)<N ) { // 用队列数据填充栈
car1 = queue->begin(queue); // 队列第一个数据先进栈
car1->hour = car->hour;
car1->min = car->min;
stack->push_back(stack, car1); // 插入到栈末尾
printf(" 车牌号为[%s]的车从便道进入停车场\n", car1->ID);
printf(" 进入时间 %d:%d\n\n", car1->hour, car1->min);
queue->pop_front(queue); // 从队列中删除
}
}
SLEEP();
}break;
case 0:
return 0;
}
}
}
int
to_traverse(Car *car)
{
printf(" 车牌号[%s]\n", car->ID);
printf(" 车辆进入的时间: %02d:%02d\n\n", car->hour, car->min);
return 0;
}
int
to_find(const Car *car)
{
if (strcmp(car->ID, tf_car->ID) == 0)
return 1;
return 0;
}
int
input_car(Car *car)
{
printf("\n 请输入车牌号(1~15个字符): ");
scanf("%15s", car->ID);
ResetIn();
printf("\n 请输入车辆进入/离开停车场的时间(小时:分钟): ");
scanf("%d:%d\n\n", &car->hour, &car->min);
ResetIn();
return 1;
}
void
menu()
{
printf(
" 请输入数字来完成:\n\n"
" 1.车辆进入停车场\n\n"
" 2.车辆离开停车场\n\n"
" 0.退出\n\n"
);
}