1设计思路
以栈模拟停车场,队列模拟门外的便道,以顺序结构实现栈。有一个可以停放停
车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场
最里面向大门口处停放,最先到达的第一辆车放在停车场的最里面。如果停车场已放满车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持次序。
2代码
#include#include #include #include #define ok 1 #define error 0 #define maxsize 3 //停车场的最大容量,根据具体情况设置 typedef struct //时间的数据结构 { int hour;//命名时 int minute;//命名分钟 }date; typedef struct //汽车的信息数据结构 { int getleave; char number[8]; int Location; date time; }car; typedef struct //构建栈 { car *top; //栈顶 car *base; //栈底 int stacksize;//栈空间大小 }Sqstack; void Initstack(Sqstack* s) //栈的初始化 { s->base = (car*)malloc(maxsize * sizeof(car)); //为顺序栈动态分配一个最大容量为maxsize的数组空间 if (!s->base) exit(error); //存储分配失败 s->top = s->base; //top初始base,空栈 s->stacksize = 2; //stacksize置最大容量为2 } void pop(Sqstack* s, car* e) //出栈 { //插入新的栈顶元素e s->top--; //栈顶指针减一 *e = *(s->top); //栈顶元素赋给e } void push(Sqstack* s, car e) //入栈 { *(s->top) = e; //e压入栈列 s->top++; //栈顶指针加一 } int Isemptystack(Sqstack* s) //判断栈是否为空 { if (s->top - s->base == 3) //栈满了 return error; else return ok; } typedef struct QNode //定义队 { car data;//声明结构变量data struct QNode* next;//指向一个 struct QNode*型的指针 }QNode, * Queueptr; typedef struct { Queueptr front;//队头指针 Queueptr rear;//队尾指针 }LinkQueue; void InitQueue(LinkQueue* Q) //初始化队列 { Q->front = Q->rear = (QNode*)malloc(sizeof(QNode));//开辟出结点 ,并分配存储空间 Q->front->next = NULL;//头结点指针域指向NULL return; } void InQueue(LinkQueue* Q, car e) //入队 { QNode* p;//定义结构体QNode*的指针变量p p = (QNode*)malloc(sizeof(QNode));//分配一个QNode类型大小的内存空间,并把它赋给QNode*型的变量p p->data = e;//将p结点的data值设为e p->next = NULL;//p指针指对象的next属性为空值 Q->rear->next = p;//尾指针rear的后继指针next=新指针p Q->rear = p;//让新结点指针p成为新的尾指针 rear return; } void OutQueue(LinkQueue* Q, car* e) //出队 { QNode* p = NULL;//定义了一个QNode*类型的结构体指针p,并将指针怕p初始化为空 p = Q->front->next;//新指针=头指针front的后继指针next *e = p->data;//将 p->data值赋给*e Q->front->next = p->next;//头指针front的后继指针next =新结点指针p的后继指针 if (Q->rear = p) Q->rear = Q->front;//特殊情况对队尾重新赋值 free(p);//释放p } int howlong(int hour1, int minute1, int hour2, int minute2) //计算时间 { return (hour2 - hour1) * 60 + (minute2 - minute1); } car gettop(Sqstack s) { return *(s.top - 1); }//返回s栈顶元素 void main() { Sqstack* park, * temp;//park为停车场的栈,temp为让道的栈 LinkQueue* lane;//lane是队列的便道 park = (Sqstack*)malloc(sizeof(Sqstack));//分配一个 Sqstack类型大小的内存空间,并把它赋给 Sqstack*型的变量park temp = (Sqstack*)malloc(sizeof(Sqstack));//分配一个 Sqstack类型大小的内存空间,并把它赋给 Sqstack*型的变量temp lane = (LinkQueue*)malloc(sizeof(LinkQueue));//分配一个 LinkQueue类型大小的内存空间,并把它赋给 LinkQueue*型的变量lane Initstack(park);//初始话栈park Initstack(temp);//初始化栈temp InitQueue(lane);//初始化队列lane int price = 2, location1 = 0, location2 = 0;//定义停车单价为每分钟俩块 while (1) { car* one;//定义结构体car*指针p one = (car*)malloc(sizeof(car));//分配一个 car类型大小的内存空间,并把它赋给 car*型的变量one printf(" -------------------------n"); printf(" 停车管理 n"); printf(" 输入进出状态:1是进,0是出n"); printf(" -------------------------n"); printf(" 输入车牌号:"); scanf("%s", &one->number); if (strcmp(one->number, "########") == 0)//如果字符串one->nunber与######相同 break; printf(" 输入时刻:"); scanf("%d:%d", &one->time.hour, &one->time.minute); printf(" 输入进出状态:"); scanf("%d", &one->getleave); switch (one->getleave) { case 1: if (Isemptystack(park))//停车场栈空 { push(park, *one);//*one进栈park location1++;//停车栈加1 one->Location = location1;//location1赋值给one->Location printf(" 车辆在停车场的位置为:%dn", one->Location); printf("*******************************************************************************n"); } else { InQueue(lane, *one);//one进队列lane location2++;//队列便道加1 one->Location = location2;//location2值赋给 one->Location printf(" 车辆在便道的位置为:%dn", one->Location); printf("******************************************************************************n"); } break; case 0: { car* e, * t;//定义结构体car指针 e 和 t e = (car*)malloc(sizeof(car));//分配一个 car类型大小的内存空间,并把它赋给 car*型的变量e t = (car*)malloc(sizeof(car));//分配一个 car类型大小的内存空间,并把它赋给 car*型的变量t do { pop(park, e);//e出栈 park push(temp, *e);//*e进栈temp } while (strcmp(e->number, one->number) != 0);//如果字符串e->number和 one->number相同 printf(" 出车车牌为:%sn", one->number); printf(" 出车时间为:%d:%dn", one->time.hour, one->time.minute); printf(" 停车费用为:%d元n", howlong(e->time.hour, e->time.minute, one->time.hour, one->time.minute) * price); printf("********************************************************************************n"); while (temp->top != temp->base)//栈temp的顶部不等于底部 { pop(temp, t);//t出栈temp push(park, *t);//*t入栈park t->Location--;//t的location值减1 } OutQueue(lane, e);//e出队lane e->Location = maxsize;//将maxsize赋值给e->Location,前面已经定义maxsize值为3 push(park, *e);//*e入栈park location2--;//便道减1 } break; default: break; } } }



