上次107班的耿**,耿**是浙大的学生,感觉浙大的学生素质确实不错,因为他写的程序一看就是经过正规训练过的。前些天写了一个有点问题约瑟夫环给我发了一份,今天又来了一个停车场管理模拟程序,这个程序可要比那个更要复杂了。约瑟夫环的数据结构仅是单向链表。而今天的停车场管理模拟确是由:1.顺序栈,链式队列的数据结构完成的。
1.基本要求:
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供进出。汽车在停车场内按车辆到达的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端。)若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入停车场。每辆停放在停车场内的汽车在它离开停车场时都要按它停留的时间长短缴纳一定的费用。
2.我采用的数据结构
以顺序栈模拟停车场,以链式队列模拟停车场外的便道;另设一个栈以存放为了给离开的车让道而从停车场暂时退出的车;
3.程序调试尚未解决的问题
(1)和上次Joseph环问题一样,存在内存读写问题
(2)不知道为什么,我的判断车辆到达离去状态的程序好像不能进行字符比较,所有的if语句都没有作用,总是执行一个分支。这个我也描述不太清楚,但是执行一下就知道是怎么回事了。
(3)可能存在但还没发现的其它一些问题。
程序写的非常清晰明了,可是有点问题
下面是有点问题的程序,看你能找出来吗?
#include <stdio.h>
#include<stdlib.h>
typedef struct {
char tag; //到达、离去标志,'A'代表到达,'D'表示离去,'E'表示输入结束
int num; //汽车车牌号吗
int time; //到达或离去时刻
} car; // 汽车数据类型
typedef struct {
car *base;
car *top;
int size;
} Stack;
typedef struct Node *QueuePtr;
struct Node {
car a; //停放在便道上的汽车
QueuePtr next;
} Node; //停车场外便道的一个结点
typedef struct {
QueuePtr front;
QueuePtr rear;
} Queue; //停车场外的便道类型(队列)
Queue Q;
Stack Park, TempPark;
int fee,n;
//有关栈(停车场和临时停车场)的一些操作
//构造一个空栈
bool InitStack( Stack s)
{
s.base = (car *) malloc(n*sizeof(car));
if(!s.base) return false;
s.top = s.base;
s.size = n;
return true;
}
//若栈不空,则用e返回栈顶元素,并返回true,否则返回false
bool GetTop( Stack s, car e)
{
if(s.top==s.base) return false;
e = *(s.top-1);
return true;
}
//若栈不空,则删除s的栈顶元素,用e返回其值,并返回true;否则返回false
bool pop( Stack s, car e)
{
if(s.top==s.base) return false;
e = *--s.top;
return true;
}
//若栈不满,则插入元素e为新的栈顶元素,并返回true;否则返回false
bool push( Stack s, car e)
{
if((s.top-s.base)==s.size) return false;
*s.top++ = e;
return true;
}
//查找栈中是否有与e牌号相同的汽车,若有,则返回true,否则返回false
bool check( Stack s, car e)
{
car *temp=s.base;
while((temp!=s.top) && (temp->num!=e.num)) temp++;
if(temp==s.top) return false;
else return true;
}
//有关队列(停车场外的便道)的一些操作
//构造一个空队列
bool InitQueue(Queue q)
{
q.front=q.rear=(QueuePtr) malloc(sizeof(Node));
if(!q.front) return false;
q.front->next=NULL;
return true;
}
//撤销队列
bool DestroyQueue(Queue q)
{
while(q.front) {
q.rear=q.front->next;
free(q.front);
q.front=q.rear;
}
return true;
}
//插入元素e为新的队尾元素
bool EnQueue(Queue q, car e)
{
QueuePtr p;
p = (QueuePtr) malloc(sizeof(Node));
if(!p) return false; //存储空间分配失败
p->a = e;
p->next = NULL;
q.rear->next=p;
q.rear = p;
return true;
}
//若队列不空,则删除q的队头元素,用e返回其值,并返回true;否则返回false
bool DeQueue(Queue q, car e)
{
if(q.front==q.rear) return false;
QueuePtr p;
p = q.front->next;
e = p->a;
q.front->next = p->next;
if(q.rear==p) q.rear=q.front;
free(p);
return true;
}
//其它函数
//初始化
void Initialization()
{
printf("*******************************************************************************/n/n");
printf("* 停车场管理模拟程序 */n/n");
printf("*******************************************************************************/n/n");
printf("请确认停车场的容量:");
scanf("%d",&n);
InitStack(Park);
InitStack(TempPark);
InitQueue(Q);
printf(" To input the auto information here:");
}
//对车辆信息进行处理的程序
void process(car a)
{
car e,tem;
if(a.tag=='A') {
if((Park. top-Park.base)<Park.size)
push(Park, a);
else EnQueue(Q,a);
}
else
{
if( !check(Park, a))
printf("输入错误,停车场中没有这辆车,请重新输入!/n");
if(a.num==(Park.top-1)->num) pop(Park, e);
else {
do {
pop(Park, tem);
push(TempPark, tem);
}while(a.num!=(Park.top-1)->num);
pop(Park, e);
do {
pop(TempPark, tem);
push(Park, tem);
}while(TempPark.top!=TempPark.base);
}
fee = a.time-e.time;
printf("第%d号车的费用是:%d/n", a.num, fee);
}
if(Q.front!=Q.rear) {
DeQueue(Q, tem);
push(Park, tem);
}
}
//以下为主函数
int main()
{
Initialization();
car c;
scanf("%c%d%d", &c.tag, &c.num, &c.time);
if(c.tag!='A' && c.tag!='D' && c.tag!='E')
printf("输入错误,请重新输入!/n");
scanf("%c%d%d", &c.tag, &c.num, &c.time);
while(c.tag!='E')
{
process(c);
printf("请输入下一辆车的信息:/n");
scanf("%c%d%d", &c.tag, &c.num, &c.time);
}
printf("程序结束/n");
return 0;
}