项目二——停车场

本文介绍了一个停车场管理系统的实现细节,包括使用队列和栈等数据结构来管理车辆进出的过程。系统支持车辆停车、显示当前状态及车辆离开等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

停车场管理
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1) 建立三个数据结构分别是:停放队列、让路栈、等候队列。

(2) 输入数据模拟管理过程,数据(入或出,车号)。

#ifndef __PARK_H__
#define __PARK_H__

#define TRUE  1
#define FALSE 0

#define SIZE 11

typedef struct _cardata
{
	int id;
	char num[20];
	char name[10];
	int time;
}CarData;

typedef struct _parkqueue
{
	CarData data[SIZE];
	int parkfront;
	int parkrear;
}ParkQueue;

typedef struct _waitnode
{
	CarData data;
	struct _waitnode *next;
}WaitNode;

typedef struct _waitqueue
{
	WaitNode *waitfront;
	WaitNode *waitrear;
}WaitQueue;

typedef struct _stacknode
{
	CarData data;
	struct _stacknode *next;
}StackNode;

typedef struct _linkStack
{
	StackNode *top;
}LinkStack;

int InitParkQueue(ParkQueue *parkq);

int ParkQueueFull(ParkQueue *parkq);

int ParkQueueEmpty (ParkQueue *parkq);

int EnParkQueue(ParkQueue *parkq,CarData x);

int DeParkQueue(ParkQueue *parkq,CarData *x);

WaitQueue* Create_Queue();

int WaitQueueEmpty(WaitQueue *waitq);

int EnWaitQueue(WaitQueue *waitq,CarData x);

int DeWaitQueue(WaitQueue *waitq,CarData *x);

LinkStack *Create_Stack();

int StackEmpty(LinkStack *s);

int Push(LinkStack *s,CarData x);

int Pop(LinkStack *s,CarData *x);

int park(ParkQueue *parkq,WaitQueue *waitq,CarData x);

void display(ParkQueue *parkq,WaitQueue *waitq);

void face();


#endif // __PARK_H__
#include "park.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int InitParkQueue(ParkQueue *parkq)
{
	if(parkq == NULL)
		return FALSE;
	
	parkq->parkfront = 0;
	parkq->parkrear = 0;
	
	return TRUE;
}

int ParkQueueFull(ParkQueue *parkq)
{
	if(parkq == NULL)
		return FALSE;
	
	return parkq->parkfront == (parkq->parkrear + 1) % SIZE;
}

int ParkQueueEmpty (ParkQueue *parkq)
{
	if (parkq == NULL)
		return FALSE;
	
	return parkq->parkfront == parkq->parkrear;
}

int EnParkQueue(ParkQueue *parkq,CarData x)
{
	if(parkq == NULL)
		return FALSE;
	
	if(ParkQueueFull(parkq))
		return TRUE;
	
	parkq->parkrear = (parkq->parkrear + 1) % SIZE;
	parkq->data[parkq->parkrear] = x;
		
	return TRUE;
}

int DeParkQueue(ParkQueue *parkq,CarData *x)
{
	if (parkq == NULL)
		return FALSE;
	
	if (ParkQueueEmpty(parkq))
		return FALSE;

	parkq->parkfront = (parkq->parkfront + 1) % SIZE;
	*x = parkq->data[parkq->parkfront];
	
	return TRUE;
}

WaitQueue* Create_Queue()
{
	WaitQueue * waitq = (WaitQueue*)malloc(sizeof(WaitQueue)/sizeof(char));
	if (waitq == NULL)
		return NULL;
	
	waitq->waitfront = NULL;
	waitq->waitrear  = NULL;
	
	return waitq;
}

int WaitQueueEmpty(WaitQueue *waitq)
{
	if (waitq == NULL)
		return FALSE;
	
	return waitq->waitfront == NULL;
}

int EnWaitQueue(WaitQueue *waitq,CarData x)
{
	if (waitq == NULL)
		return FALSE;
	
	WaitNode * waitnode = (WaitNode*)malloc(sizeof(WaitNode)/sizeof(char));
	if (waitnode == NULL)
		return FALSE;
	
	waitnode->data = x;
	waitnode->next = NULL;
	
	if (waitq->waitfront == NULL)
	{
		waitq->waitfront = waitnode;
		waitq->waitrear  = waitnode;
	}
	else
	{
		waitq->waitrear->next = waitnode;
		waitq->waitrear = waitnode;
	}
		
	return TRUE;
}

int DeWaitQueue(WaitQueue *waitq,CarData *x)
{
	if (waitq == NULL)
		return FALSE;
	
	if (WaitQueueEmpty(waitq))
		return FALSE;
		
	WaitNode *p = waitq->waitfront;
	*x = p->data;
	
	waitq->waitfront = p->next;
	free(p);
	
	if (waitq->waitfront == NULL)
		waitq->waitrear = NULL;
		
	return TRUE;

}

LinkStack *Create_Stack()
{
	LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack)/sizeof(char));
	if (s == NULL)
		return NULL;

	s->top = NULL;
	
	return s;
}

int StackEmpty(LinkStack *s)
{
	if (s == NULL)
		return FALSE;
	
	return s->top == NULL;
}

int Push(LinkStack *s,CarData x)
{
	if (s == NULL)
		return FALSE;
	
	StackNode* snode = (StackNode*)malloc(sizeof(StackNode)/sizeof(char));
	if (snode == NULL)
		return FALSE;

	snode->data = x;
	snode->next = s->top;
	s->top = snode;
	
	return TRUE;
}

int Pop(LinkStack *s,CarData *x)
{
	if (s == NULL)
		return FALSE;
	
	if (StackEmpty(s))
		return FALSE;
	
	StackNode *p = s->top;
	*x = p->data;
	
	s->top = p->next;
	free(p);	
	
	return TRUE;
}

int park(ParkQueue *parkq,WaitQueue *waitq,CarData x)
{
	if(parkq == NULL || waitq == NULL)
		return FALSE;
	
	if(ParkQueueFull(parkq))
	{
		EnWaitQueue(waitq,x);
		printf("车位已满,进入等候队列!\n");
	}
	else
	{
		EnParkQueue(parkq,x);
		printf("成功停车,进入停车队列!\n");
	}
	
	return TRUE;
}

void display(ParkQueue *parkq,WaitQueue *waitq)
{
	if(parkq == NULL || waitq == NULL)
		return;
	
	printf("停车队列-----------------------------------\n");
	
	int tmp1 = parkq->parkfront;	
	do
	{
		tmp1 = (tmp1 + 1) % SIZE;
		printf("%4d%15s%15s%9d\n",parkq->data[tmp1].id,parkq->data[tmp1].num,\
		parkq->data[tmp1].name,time(NULL) % 86400 - parkq->data[tmp1].time);
	}while(tmp1 != parkq->parkrear);
	
	printf("候车队列-----------------------------------\n");
	
	WaitNode *tmp2 = waitq->waitfront;
	while(tmp2 != NULL)
	{
		printf("%4d%15s%15s%9d\n",tmp2->data.id,tmp2->data.num,\
		tmp2->data.name,time(NULL) % 86400 - tmp2->data.time);
		tmp2 = tmp2->next;
	}
}

int away(ParkQueue *parkq,WaitQueue *waitq,LinkStack* s,int id)
{

	CarData x;
	int tmp1 = (parkq->parkfront) % SIZE;	
	
	do
	{
		tmp1 = (tmp1 + 1) % SIZE;
		if(parkq->data[tmp1].id != id)
		{
			DeParkQueue(parkq,&x);
			Push(s,x);
		}
		else
		{
			DeParkQueue(parkq,&x);
			
			while(StackEmpty(s) != TRUE)
			{
				Pop(s,&x);
				EnParkQueue(parkq,x);
			}
			
			if(WaitQueueEmpty(waitq) != TRUE)
			{
				DeWaitQueue(waitq,&x);
				EnParkQueue(parkq,x);
			}
			return TRUE;
		}
	}while(tmp1 != parkq->parkrear);
	
	printf("未找到该ID!\n");
	
	return FALSE;
}

void face()
{
	system("clear");
	printf("**************************************************\n");
	printf("|                                                |\n");
	printf("|        1、停车                2、显示          |\n");
	printf("|                                                |\n");
	printf("**************************************************\n");
	printf("|                                                |\n");
	printf("|        2、显示                3、离开          |\n");
	printf("|                                                |\n");
	printf("**************************************************\n");
	printf("|                                                |\n");
	printf("|                   4、退出                      |\n");
	printf("|                            madeby:XuYuanMing  |\n");
	printf("**************************************************\n\n");
	printf("请输入您要执行的操作(1-4):");
}
#include "park.h"
#include <stdio.h>
#include <string.h>
#include <time.h>

int count = 7; 

int main()
{
	ParkQueue parkq;
	InitParkQueue(&parkq);
	
	WaitQueue* waitq = Create_Queue();
	
	LinkStack* s = Create_Stack();
	
	CarData data1 = {1,"qw123213","zhangsan1",time(NULL) % 86400};
	CarData data2 = {2,"qw123213","zhangsan2",time(NULL) % 86400};
	CarData data3 = {3,"qw123213","zhangsan3",time(NULL) % 86400};
	CarData data4 = {4,"qw123213","zhangsan4",time(NULL) % 86400};
	CarData data5 = {5,"qw123213","zhangsan5",time(NULL) % 86400};
	CarData data6 = {6,"qw123213","zhangsan6",time(NULL) % 86400};
	CarData data7 = {7,"qw123213","zhangsan7",time(NULL) % 86400};
	EnParkQueue(&parkq,data1);
	EnParkQueue(&parkq,data2);
	EnParkQueue(&parkq,data3);
	EnParkQueue(&parkq,data4);
	EnParkQueue(&parkq,data5);
	EnParkQueue(&parkq,data6);
	EnParkQueue(&parkq,data7);
	
	char num[20];
	char name[10];
	int id;
	int quit;
	int choice;
	CarData x;
	
	while(1)
	{
		face();
		scanf("%d",&choice);
		if(choice == 1)
		{
			while(1)
			{
				printf("请输入车牌号:");
				scanf("%s",num);
				printf("请输入车主名:");
				scanf("%s",name);
				
				count++;
				x.id = count;
				strcpy(x.num,num);
				strcpy(x.name,name);
				x.time = time(NULL) % 86400;
				
				park(&parkq,waitq,x);
				
				printf("输入1继续停车,输入2退出:");
				scanf("%d",&quit);
				
				if(quit == 2)
					break;
			}
		}
		
		else if(choice == 2)
		{
			display(&parkq,waitq);
			
			printf("输入2退出:");
			scanf("%d",&quit);
				
			if(quit == 2)
					continue;
		} 
		
		else if(choice == 3)
		{
			while(1)
			{
				printf("请输入ID:");
				scanf("%d",&id);
				away(&parkq,waitq,s,id);
				
				printf("输入2退出:");
				scanf("%d",&quit);
				
				if(quit == 2)
					break;
			}
		}
		
		else
		{
			break;
		}
	}
    return 0;
}




设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟该停车场的管理。(2) 实现要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。(2) 实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(’A’,1,5)表示1号牌照车在5时刻到达,而(’D’,5,20)表示5号牌照车在20时刻离去。整个程序可以在输入信息为(’E’,0,0)时结束。本题可用顺序存储结构和链式存储结构来实现。本人的一个数据结构课程设计(用C++源码实现,供大家学习参考之用,有不妥之处望指正)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值