1.实验目的:掌握线性表的基本操作,深入理解栈、队列的存储结构并掌握进栈、出栈和入队、出队的实现。
2.解题思路:
问题:设有一个可停放N辆汽车的狭长停车场,只有一个大门供车辆出入,车辆按到达先后顺序从最里面向大门口停放。如果已放满N辆车,再来的车辆只能在大门外的便道上等候,一旦有车辆从停车场离开排在便道上的车辆可依次进入停车场。停车场中某车辆离开时,在它之后进入停车场的车辆必须为它让路退出停车场,等待该车辆离开后,其后车辆依原次序进入停车场。每辆汽车在离开时,都要依据停留时间缴费;停在便道上的车辆不收费,在便道上某车辆进入停车场或离去后,其余车辆依然保持原来的次序。
思路:汽车的模拟输入信息格式可定义为:
(到达/离去的标志,汽车牌照号码,到达/离开的时刻)
例如(‘A’,1,5)表示:1号牌照汽车在5时刻到达;而(‘D’,5,20)表示:5号牌照汽车在时刻20离去。整个程序在输入(‘E’,0,0)时结束。
3.程序实现:
/*停车场管理*/
#include "stdio.h"
#include<stdlib.h>
#define N 3
#define M 5
#define Null 0
#define True 1
#define False 0
/*定义车辆的数据类型*/
typedef struct
{
int num; /*车辆车牌号*/
int arrtime; /*车辆到达时间*/
}elemtype;
/*定义顺序栈(停车场)数据类型*/
typedef struct //
{
elemtype stack[N];/*定义存放元素的数组*/
int top;/*定义栈顶指针*/
}sqstktp;
/*定义链队列元素(停在停车场外便道上的车辆)数据类型*/
typedef struct node
{
int num;/*车牌号*/
struct node *next;/*后边相邻车辆所在位置*/
}queueptr;
/*链队列的队头指针和队尾指针的数据类型*/
typedef struct
{
queueptr *front,*rear;/*链队列的队头指针和队尾指针*/
}linkedquetp;
/*初始化顺序栈(停车场)*/
void inistack(sqstktp *s)
{
s->top=-1;/*栈顶指针置为-1*/
}
/*元素入栈(汽车驶入停车场)*/
int push(sqstktp *s,elemtype x)
{
if(s->top==N-1)/*如果栈满(停车场无车位)*/
return (False);/*返回0*/
else
{
s->stack[++s->top]=x;
/*首先栈顶指针+1,然后元素入栈(车辆驶入停车场)*/
return(True);/*返回1*/
}
}
/*元素出栈(汽车驶出停车场)*/
elemtype pop(sqstktp *s)
{
elemtype x;/*出栈元素(要驶出停车场的车辆)*/
if(s->top<0)/*如果是空栈(停车场无车)*/
{
x.num=Null;/*车牌号置为0*/
x.arrtime=Null