停车场管理实验报告
姓名: 学号:
学院:继续教育学院 班级:计算机科学与技术
一. 实验目的和要求
熟练栈和队列的结构特性,掌握在实际问题背景下的应用 二. 实验主要内容
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及达到或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆达到、则输出汽车在停车场内或便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 ,
三. 实验仪器和环境
PC机 Windows xp Visual c++ c语言 四.实验原理 1.概要设计
(1)抽象数据类型定义 ADT Stack{
数据对象:D={ai|ai ∈ElemSet, i=1,2,…n;n>0} 数据关系:R1={
基本操作:
InitStack(&S)
操作结果:构造一个空栈S。 Push(&S,e)
初始条件:栈S已存在。
操作结果:插入e为新的栈顶元素 Pop(&S,&e)
初始条件:栈S已存在。 |
操作结果:删除S的栈顶元素,并且用e返回。
}ADT Stack ADT Queue {
数据对象:D={ai|ai ∈ElemSet, i=1,2,…n; n>0}
数据关系:R1={
InitQueue(&Q);
操作结果:构造一个空队列Q
<
EnQueue(&Q,&e);
初始条件:对列Q已存在。
操作结果:插入元素e为Q的新队尾元素。
DeQueue(&Q,&e);
初始条件:对列Q已存在。
操作结果:删除Q的队头元素, 并用e返回。 }ADT Queue
(2)本程序包含七个模块: · <1>主程序模块,其中主函数为 Void main(){ 初始化; 构造空栈; 输入已知数据; 插入数据入栈; 分析
{入栈;出栈;入队;出队;}
、
输出数据; }
<2>构造栈模块-----构造一个空栈;
栈插入模块-----插入新的数据元素; 栈删除模块-----删除指定的数据元素;
构造队列模块-----构造一个空队列;
队列插入模块-----插入新的数据元素; 队列删除模块-----删除指定的数据元素; {
(3)各模块之间的调用关系如下:
主函数模块 分析 构造栈模块 栈插入模块 栈删除模块 构造队列模块 队列插入模块 * 2.详细设计 <1>类型定义
#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define MONEY 5 typedef int Status; …
typedef struct ElemType{
char a[3]; int num;
int time; }ElemType;
typedef struct SqStack {
ElemType *base; }LinkQueue;
QueuePtr rear;//队尾指针
<2>栈和队列的基本操作
Status InitStack(SqStack &S) //构造一个空栈
Status Push(SqStack &S,ElemType e) //插入元素e为新的栈顶元素
Status Pop(SqStack &S,ElemType &e) …
//若栈不空,则删除S的栈顶元素,用e 返回其值,并返回OK;否则返回ERROR Status InitQueue(LinkQueue &Q)
//构造一个空队列Q
Status EnQueue(LinkQueue &Q,ElemType e)
//插入元素e为Q的新队列
Status DeQueue(LinkQueue &Q,ElemType &e)
//若队列不空,则删除Q的对头元素,用e返回其值,并返回Ok;否则返回ERROR; <3>部分操作的算法 、
Status InitStack(SqStack &S){//构造一个空栈
=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(! exit (OVERFLOW); =; =STACK_INIT_SIZE; return OK; }
Status Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素 }
if栈满,追加存储空间
=(ElemType *)realloc,+STACKINCREMENT)*sizeof(ElemType));
if(! exit(OVERFLOW);//存储分配失败 =+; +=STACK_INIT_SIZE; } *++=e; return OK; }
Status Pop(SqStack &S,ElemType &e){
//若栈不空,则删除S的栈顶元素,用e 返回其值,并返回OK;否则返回ERROR if== return OK; e=*;
return OK; }
//----------------队列 -
Status InitQueue(LinkQueue &Q){//构造一个空队列Q ==(QueuePtr)malloc(sizeof(QNode)); if(! exit (OVERFLOW);//存储分配失败 >next=NULL; return OK; }
Status EnQueue(LinkQueue &Q,ElemType e){//插入元素e为Q的新队列 p=(QueuePtr)malloc(sizeof(QNode));//存储分配失败 )
if(!p) exit(OVERFLOW); p->data=e;p->next=NULL; >next=p; =p; return OK; }
Status DeQueue(LinkQueue &Q,ElemType &e){
//若队列不空,则删除Q的对头元素,用e返回其值,并返回Ok;否则返回ERROR; } }
<
if== return ERROR; p=>next; e=p->data; >next=p->next; if==p) =; free(p); return OK;
五.源程序 #include <> #include <> #include <> #include <>
//------------------------函数结果状态代码 #define TRUE 1 }
#define FALSE 0 #define OK 1 #define ERROR 0
#define TNFEASIBLE -1
#define OVERFLOW -2
//Status 是函数的类型,其值是函数结果状态代码 typedef int Status;
#define STACK_INIT_SIZE 100 ^
#define STACKINCREMENT 10 #define MONEY 5
typedef struct ElemType{ char a[3]; int num; int time; }ElemType;
typedef struct SqStack { ~
ElemType *base;//在栈构造之前和销毁之后,base的值为NULL ElemType *top;//栈顶指针
int stacksize;//当前已经分配的存储空间,以元素为单位 }SqStack;//栈的表示 typedef struct QNode{ ElemType data; struct QNode *next;
}QNode,*QueuePtr;//队列的表示 、
typedef struct LinkQueue{
QueuePtr front;//队头指针 QueuePtr rear;//队尾指针 }LinkQueue;
//-----------------基本操作的实现 //-----------------栈
Status InitStack(SqStack &S){//构造一个空栈
=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); \
if(! exit (OVERFLOW); =; =STACK_INIT_SIZE; return OK; }//InitStack
Status Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素 if栈满,追加存储空间 =(ElemType *)realloc,+STACKINCREMENT)*sizeof(ElemType)); ~
if(! exit(OVERFLOW);//存储分配失败 =+;
+=STACK_INIT_SIZE;