数据结构实验
第一章 个人图书信息管理系统
第二章 停车场管理
第三章 哈夫曼编码
第二章 停车场管理
前言
栈:只能在表的一端(栈顶)进行插入和删除运算的线性表。逻辑结构为一对一,顺序栈存储结构更常见。
运算规则: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.函数之间的调用关系

四、用户界面

五、测试结果


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

被折叠的 条评论
为什么被折叠?



