停车场管理系统(C++)

数据结构课设作业

数据结构的初学者,根据自己对于栈和队列的简单理解,编写的停车场管理系统,解决了一系列问题之后所写。

有不对的地方欢迎指正,以下是代码

#include<string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 5
#define STACK_INCREMENT 2
typedef int SElemType;
typedef int Status;

//定义车的基本信息
typedef struct
{
	int arrive[2];       //arrive[0]、arrive[1]分别记录车辆进入的时、分
	int leave[2];        //leave[0]、leave[1]分别记录车车辆离开的时、分
	char num[10];        //车牌信息   
}car;
//定义队列(队列的链式存储结构)
typedef struct QNode
{
	car data;             
	QNode *next;          
}QNode, *QueuePtr;            //给队列添加数据域和指针域    
typedef struct
{
	QueuePtr front;            //队头指针
	QueuePtr rear;             //队尾指针

}LinkQueue;
//定义栈  (栈的链式存储结构)
typedef struct StackNode
{
	SElemType data;
	struct StackNode *next;
}StackNode, *StackPtr;
typedef struct SqStack
{
    int base;      //栈底指针
	int top;       //栈顶指针
	car parkcar[STACK_INIT_SIZE];
	int stacksize;       //栈可用的最大容量
}SqStack;
//构造一个空栈一个空队列即创建一个停车场
void CreatePark(SqStack &S, LinkQueue &Q)
{
	S.base = S.top = 0;               //base初始为top,空栈
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));       
	if (!Q.front)exit(0);                        
	Q.front->next = NULL;                        //头结点的指针域置空
	printf("恭喜停车场创建成功!\n");
}

//遍历栈和队列即显示停车情况
//停车场的情况
void ShowStack(SqStack &S)              
{
	int j = S.base;         //S.base栈底位置记为j
	while (j < S.top)       //当S.top位置大于栈底位置(栈中有存储内容)
	{
	printf("%s    %d:%d   %d",S.parkcar[j].num,S.parkcar[j].arrive[0],S.parkcar[j].arrive[1],j+1);
		 printf("\n");
		 j++;
	}
}
//临时停车点的情况(利用队列先进先出特点)
void ShowQueue(LinkQueue &Q)
{
	QueuePtr p = Q.front->next;   //链队指针p指向头结点的指针域
	while (p)                     //当p非空,进行循环
	{
		car c = p->data;          //队列的数据域赋给car型变量c
		printf("%s	%d:%d",c.num,c.arrive[0],c.arrive[1]); //输出车辆信息
		if (p != Q.rear)          //若p与队尾所指位置不同
		{
			p = p->next;          //指针后移
		}
		else
		{
			Q.rear = Q.front;     
			p = NULL;             
		}
	}
}
//总体情况的显示
void ShowInformation(SqStack &S,LinkQueue &Q)
{
	if (S.base != S.top)        //栈顶与栈底不在同一位置(栈非空)
	{
		printf("车牌号		停车时间		停车位置\n");
		ShowStack(S);
	}
	else             //输出队列中的信息
	{
		ShowQueue(Q);

	}
}
//一些基本操作:入栈,入队
//入栈即汽车进入停车场
void PushSqStack(SqStack &S, car ch)        //入栈
{
	printf("请输入当前小时:");
	scanf("%d",&ch.arrive[0]);
	printf("请输入当前分钟:");
	scanf("%d",&ch.arrive[1]);
	S.parkcar[S.top++] = ch;              //记录车辆信息,栈顶上移
	printf("已将您的车停好,车的位置是:%d\n", S.top);
}
//入队列即进入临时停车点
void PushQueue(LinkQueue &Q, car ch)
{
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));  //链队指针p
	if (!p){exit(0);}
	p->data = ch;                                  //将车辆信息赋给队列数据域
	p->next = NULL;                                //p的指针域置为空
	Q.rear->next = p;
	Q.rear = p;
	printf("对不起,停车场已满,请您在临时停车区等待!");
	ShowQueue(Q);
}
//出栈,出队列

//出队列即进入停车场
car PopQueue(LinkQueue &Q)     
{
	car ch;
	QueuePtr p;
	p = Q.front->next;               //链队指针p指向头结点的指针域
	ch = p->data;                    //车辆信息ch赋给头结点的数据域
	Q.front->next = p->next;         //指针后移
	if (Q.rear == p)                 
	{
		Q.rear = Q.front;      
	}
	free(p);
	return ch;
}
//判断队列是否为空
int QueueEmpty(LinkQueue &Q)
{
	if (Q.front == Q.rear)return 1;    // 队头、队尾指针的值相同,队空    
	else return 0;
}
//出栈即离开停车场
void PopSqStack(SqStack &S, LinkQueue &Q)//(双栈共享一个栈空间)
{
	int i;
	if (S.base == S.top)                //栈头、栈尾指针的值相同,栈空
	{
		printf("停车场没有车!\n");
		exit(0);
	}
	SqStack sq;                        //定义另一个栈,栈2
	printf("请输入您的停车位置:\n");
	scanf("%d",&i);
	sq.base = sq.top = 0;             //base初始为top,空栈
	while (S.top > i)                 //找到车辆位置,结束循环
		sq.parkcar[sq.top++] = S.parkcar[--S.top];//栈2的顶指针与栈顶指针移动
	int n = --S.top;                  //n记录车辆
	printf("请输入当前小时:\n");
	scanf("%d",&S.parkcar[n].leave[0]);
	printf("请输入当前分钟:\n");
	scanf("%d",&S.parkcar[n].leave[1]);
	int time = (S.parkcar[n].leave[0] - S.parkcar[n].arrive[0]) * 60 + (S.parkcar[n].leave[1] - S.parkcar[n].arrive[1] );//按分钟计算车辆停车时间
	double money = time*0.05;                //计算所需费用
	printf("您的停车时长为:%d分钟\n", time);
	printf("你本次停车的费用为%lf:",money);
	printf("\n");
	printf("谢谢您使用本系统,欢迎下次光临!\n");
	while (sq.top > sq.base)       //当栈2的头、尾指针位置相同,结束循环
		S.parkcar[S.top++] = sq.parkcar[--sq.top];
	if (QueueEmpty(Q))           //队列非空
	{
		S.parkcar[S.top] = PopQueue(Q);   //便道中的第一辆车进入停车场
	printf("车牌号为%s的车从临时停车点进入停车场,停车位置为%d\n", S.parkcar[S.top].num, S.top + 1);
		printf("请输入当前小时:%d\n");
		scanf("%d",&S.parkcar[S.top].arrive[0]);
		printf("请输入当前分钟:%d\n");
		scanf("%d",&S.parkcar[S.top].arrive[1]);
		S.top++;
	}	
}
//构建整个停车场
//登记车辆信息
car Register()
{
	car c;
	printf("请输入您的车牌号:");
	scanf("%s",&c.num);
	c.arrive[0] = 0;
	c.arrive[1] = 0;
	c.leave[0] = 0;
	c.leave[1] = 0;
	return c;
}
//判断一辆车到达后是否需要构造队列
void Judge(SqStack &S, LinkQueue &Q)
{
	car  ch = Register();
	if (S.top == STACK_INIT_SIZE)  //如果栈满,推入队列,否则推入栈
	{
		PushQueue(Q, ch);
	}
	else
	{
		PushSqStack(S, ch);
	}
}
//功能目录函数
void menu()
{
	printf("-------------------------------------------\n");
	printf("|                                         |\n");
	printf("|         欢迎使用停车场管理系统          |\n");
	printf("|                                         |\n");
	printf("|                                         |\n");
	printf("|            请选择您需要的功能           |\n");
	printf("|               1.创建停车场              |\n");
	printf("|               2.车进停车场              |\n");
	printf("|               3.车出停车场              |\n");
	printf("|               4.查看停车情况            |\n");
	printf("|               0.退出系统                |\n");
	printf("|                                         |\n");
	printf("-------------------------------------------\n");
}
//主函数
int main()
{
	SqStack S;
	LinkQueue Q;
	int i;
	menu();              //功能目录
	while(1)
		{
			 printf("请继续输入你的选择:");
	        scanf("%d",&i);
		    switch (i)
		{
		case 1:CreatePark(S,Q);//构造一个空栈一个空队列即创建一个停车场
			  system("pause");
			  break;
		case 2:Judge(S, Q);    //判断一辆车到达后是否需要构造队列
			  system("pause");
			  break;
		case 3:PopSqStack(S,Q);//出栈即离开停车场
			  system("pause");
			  break;
		case 4:ShowInformation(S,Q);//总体情况的显示
			  system("pause");
			  break;
		case 0:printf("已退出,谢谢使用!");
			  return 0;
		default:printf("对不起,您的输入有误,已强制退出,请重新登录!");
			  system("pause");
		}
		}
	return 0;
}
  • 12
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
停车场管理系统可以使用栈或队列来实现。下面以使用队列为例: 1. 定义车辆结构体: ```cpp struct Car { string licensePlate; // 车牌号 int arrivalTime; // 到达时间 }; ``` 2. 定义停车场类,其中包含入场、出场、查询等操作: ```cpp class ParkingLot { private: queue<Car> cars; // 停车场队列 int capacity; // 停车场容量 int feeRate; // 收费标准 public: ParkingLot(int cap, int rate) : capacity(cap), feeRate(rate) {} bool park(Car car); // 入场 int leave(string licensePlate); // 出场 int query(string licensePlate); // 查询 }; ``` 3. 实现入场操作: ```cpp bool ParkingLot::park(Car car) { if (cars.size() == capacity) return false; // 停车场已满 cars.push(car); return true; } ``` 4. 实现出场操作: ```cpp int ParkingLot::leave(string licensePlate) { int fee = 0; queue<Car> temp; // 临时队列 while (!cars.empty()) { Car car = cars.front(); cars.pop(); if (car.licensePlate == licensePlate) { // 找到车辆 fee = (time(NULL) - car.arrivalTime) * feeRate; // 计算费用 break; } temp.push(car); } while (!temp.empty()) { // 将临时队列中的车辆重新加入停车场队列 cars.push(temp.front()); temp.pop(); } return fee; } ``` 5. 实现查询操作: ```cpp int ParkingLot::query(string licensePlate) { int time = -1; queue<Car> temp; // 临时队列 while (!cars.empty()) { Car car = cars.front(); cars.pop(); if (car.licensePlate == licensePlate) { // 找到车辆 time = time(NULL) - car.arrivalTime; // 计算停车时间 break; } temp.push(car); } while (!temp.empty()) { // 将临时队列中的车辆重新加入停车场队列 cars.push(temp.front()); temp.pop(); } return time; } ``` 以上就是一个简单的停车场管理系统数据结构的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值