数据结构实验--停车场管理

该博客介绍了数据结构实验中的停车场管理系统设计,利用顺序栈模拟停车场,链队模拟便道,通过C#实现。文章涵盖了需求分析、概要设计、详细设计、用户界面和测试结果,探讨了栈和队列的逻辑结构和运算规则,并详细定义了顺序栈和链队的抽象数据类型。

数据结构实验

第一章 个人图书信息管理系统
第二章 停车场管理
第三章 哈夫曼编码



前言

栈:只能在表的一端(栈顶)进行插入和删除运算的线性表。逻辑结构为一对一顺序栈存储结构更常见。
运算规则:LIFO/FILO
基本操作有:入栈、出栈、读栈顶单元、栈空等等。

队列:在队尾进行插入,在队头进行删除的线性表。逻辑结构为一对一顺序队列链表存储均可。
运算规则:FIFO
基本操作:入队、出队

一、需求分析

以栈模拟停车场,以队列模拟停车场外的便道;
栈以顺序结构实现,队列以链表结构实现


二、概要设计

1.设计停车场顺序栈的抽象数据类型定义

ADT Carstack{
数据对象:D={a[i] | a[i]∈ElemSet,i=1,2,3…MAXSIZE}
数据关系:R1={<a[i-1],a[i]> | a[i-1],a[i]∈D,i=1,2,…,MAXSIZE}
约定an端为栈顶,a1端为栈底。
基本操作:
InitStack(CarStack *S);
操作结果:构造一个空的顺序栈S。
DestroyStack(CarStack *S);
初始条件:顺序栈S已存在
操作结果:销毁栈S。
Push(CarStack *S,LinkQueue *Q,char flag,int id,int time);
初始条件:顺序栈S、T,链队Q已存在
操作结果:在顺序栈S的栈顶插入新的车辆信息。
Pop(CarStack *S,TempStack *T,LinkQueue *Q,char flag,int id,int time);
初始条件:顺序栈S、T,链队Q已存在
操作结果:符合条件的车辆进行出栈操作。

}

2.设计便道链队抽象数据类型定义

ADT LinkQueue{
数据对象:D={a[i] | a[i]∈ElemSet,i=1,2,3…MAXSIZE}
数据关系:R1={a[i] = a[i-1]->next | a[i-1],a[i]∈D,i=1,2,…,MAXSIZE}
约定a1端为队列头,an端为队列尾。
基本操作:
InitQueue(LinkQueue *Q);
操作结果:构造一个空的链队Q。
DestroyQueue(LinkQueue *Q);
初始条件:链队Q已存在
操作结果:销毁链队Q。
EnQueue(CarStack *S,LinkQueue *Q,char flag,int id,int time);
初始条件:顺序栈S,链队Q已存在
操作结果:插入新的链队Q的队尾元素。
}

3.设计临时停放区顺序栈的抽象数据类型定义

ADT TempStack{
数据对象:D={a[i] | a[i]∈ElemSet,i=1,2,3…MAXSIZE}
数据关系:R1={<a[i-1],a[i]> | a[i-1],a[i]∈D,i=1,2,…,MAXSIZE}
约定an端为栈顶,a1端为栈底。
基本操作:
InitTemp(TempStack *T);
操作结果:构造一个空的顺序栈T。
void DestroyTemp(TempStack *T);
初始条件:顺序栈T已存在
操作结果:销毁栈T。
}

4.模块划分

(1)主程序模块

int main(void)
{
    初始化;
    输入;
    while(命令 != 退出)
    {
        判断命令;
        执行命令;
        输入;
	}
	销毁;
} 

(2)顺序栈S模块

(3)链队Q模块

(4)顺序栈T模块

(5)各模块之间的调用关系

在这里插入图片描述


三、详细设计

#define MAXSIZE 2
#define SElemtype int
#define QElemtype int
#define ARRIVAL 1
#define DEPARTURE 0 
#define FEE 1

1.顺序栈S的类型

/*以栈模拟停车场, 栈以顺序结构实现 */
typedef struct{
	int ID;   //汽车号码牌信息
	int time_In;   //进入停车场的时刻
	char flag;   //汽车 “到达 ”或 “离去 ” 的信息
}Car,*CarPtr;
typedef struct{
	//Car park[MAXSIZE];   //汽车信息 
    CarPtr base;   //栈底指针 
	CarPtr top;   //栈顶指针 
	int stacksize;   //栈中包含的最大元素个数 
}CarStack;
基本操作如下:
void InitStack(CarStack *S);   //停车场顺序栈初始化
void Push(CarStack *S,LinkQueue *Q,char flag,int id,int time);   //停车场顺序栈进栈
void Pop(CarStack *S,TempStack *T,LinkQueue *Q,char flag,int id,int time);   //停车场顺序栈出栈 
void DestroyStack(CarStack *S);   //销毁顺序栈

2.链队Q的类型

/*以队列模拟停车场外的便道, 队列以链表结构实现 */
typedef struct{
	SElemtype ID;   //汽车号码牌信息
	SElemtype time_In;   //进入停车场的时刻
	struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct{
	QueuePtr front;   //队头指针 
	QueuePtr rear;   //队尾指针
}LinkQueue;
基本操作如下:
void InitQueue(LinkQueue *Q);   //过道链队初始化
void EnQueue(CarStack *S,LinkQueue *Q,char flag,int id,int time);    //过道链队入队 
void DestroyQueue(LinkQueue *Q);   //销毁链队列

3.顺序栈T的类型

/*另设一个栈,临时停放未给要离去的汽车让路而从停车场退出来的汽车 */
typedef struct{
    //Car temp[MAXSIZE];   //汽车信息 
	CarPtr base;   //栈底指针 
	CarPtr top;   //栈顶指针 
	int stacksize;   //栈中包含的最大元素个数 
}TempStack;
基本操作如下:
void InitTemp(TempStack *T);   //临时停放顺序栈初始化
void DestroyTemp(TempStack *T);   //销毁顺序栈

4.主函数和其他函数

int main(void)
{
	CarStack S;   //停车场 
	LinkQueue Q;   //便道
	TempStack T;   //临时停放区
	
	/*初始化 */ 
	InitStack(&S); 
	InitTemp(&T);
	InitQueue(&Q);
    interface();
    
    char flag;
    int id,time;
    scanf("%c%d%d",&flag,&id,&time);
    
    while(flag != 'E')
    {
    	switch(flag)
    	{
    		case 'A':
    			Push(&S,&Q,flag,id,time);break;
    		case 'D':
    			Pop(&S,&T,&Q,flag,id,time);break;
    	}
    	scanf("%c%d%d",&flag,&id,&time);
    }
    DestroyStack(&S);   
    DestroyStack(&T);
    DestroyQueue(&Q);
    return 0;
}

5.函数之间的调用关系

在这里插入图片描述


四、用户界面

在这里插入图片描述


五、测试结果

在这里插入图片描述
在这里插入图片描述


总结

具体代码请关注博主已发布的资源!
停车场代码

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUPT_bo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值