#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100
//我发现了,对于实验 完成的每一步操作 都最好记录一下!!!!!!!!!!!!!!!!!!!!!!!!!!!
//栈 先进后出
//队列 先进先出
//汽车的三项信息
typedef struct{
char ch;//车辆的识别符,到达or离去
int time;//车辆停车时间
int carpai;//车辆车牌号
}Car;
//顺序栈实现停车场
typedef struct{
Car data[MAXSIZE];//停车场最大可以停放100量汽车
int top;
}StopCar;
//链队实现排队进停车场
//好了好了不说了,我突然发现现在我剩下的错误都是 由于队列中的指针问题 所引起的//改成别人写的试试
typedef struct BiandaoCar{
Car data[MAXSIZE];//等候区最大可以停放100量汽车 //为什么链表也有范围啊???????????????
struct BiandaoCar *next;
}BiandaoCar;
typedef struct{
BiandaoCar *front;
BiandaoCar *rear;
}BiandaoLink;//
int cost;//看起来好像全局变量在每个函数中定义后之后的函数会被影响到
int n;
//我发现了 好像除了主函数,其余的函数不能引用其他的函数,
void InitStack(StopCar *);//停车场初始化 ,临时停车初始化
int InitQueue(BiandaoLink *);//初始化等候区
void Arriveparing(StopCar *,BiandaoLink *,char ,int,int );//入库函数
void Leaveparking(StopCar *,char ,int,int );//离开函数
int IfTheCar(StopCar *,char);//判断是否有输入的这辆车
void Biandaoparking(StopCar *,BiandaoLink *);//将便道上的车进入车库
int k=0;
//将便道上的车进入车库
void Biandaoparking(StopCar *stopcar,BiandaoLink *biandaocar)
{
//这样队列就不是二级指针了吗,但是为什么不能用 biandaocar.front而是必须要用 biandaocar->front
//判断便道有无车
if(biandaocar->front ==biandaocar->rear ) //结果我对队列不熟悉!!!!!!!!
printf("便道没有车");//对于判断栈队列等里面是否为空,我总是忘记
else
{
//出队 --队列是先进先出
BiandaoCar *q;
q=biandaocar->front->next;
(biandaocar->front )=q->next ;//不知道为啥在这里就不能自动生成
if(biandaocar->rear ==q) //如果S是最后一个元素,则让队尾指针指向队头,防止变成野指针
biandaocar->rear =biandaocar->front ;
printf("%d出便道成功!\n",q->data[k].carpai );
//不是吧链式结构也能用数组,以及为什么要用
//没错p不仅仅是纯正的链式结构,而且还不是 队列
//但是不用数组也可以吧,因为队列是按照顺序来的
//等我将这个程序弄得能运行了在来搞搞,用个标记@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//进栈
//好像我对栈也不熟悉
//之前的问题就是 对于这么长的字符我不确定是否正确,不对,应该是我没有办法记下这么长的字符,推得也害怕不对
//每个top都表示当下的值,要添加新的值的话,就得让top+1。
//说起来,用p来盛放数值真不错,对于栈来说,front和rear真的只是指针,虽然也盛放数值但是不用 ,输入输出都靠p ,也不算的吧,不过感觉复杂的用p更方便,不然就会要用一大堆 字符了
stopcar->data[stopcar->top +1].carpai =q->data[k].carpai ;
stopcar->data [stopcar->top +1].ch=q->data[k].ch;//我发现了只有当所有字符是紧紧贴在一起时,才会自动生成
stopcar->data [stopcar->top +1].time=q->data[k].time;//不过我认为应该top是+1了,但为什么是保持同步的呢 ,
//———————————因为我们是把top看做为一个具体的数值,假如top=7,则top+1即是 7+1;也是一个具体的数值但是top++实际上是top=top+1;
printf("%d进库成功!\n",q->data[k].carpai);//用这个是明智的,因为不知道 top是否已经+1了
k++;
stopcar->top ++;
}
}
void Leaveparking(StopCar *stopcar,char ch,int carpai,int time) //出库
{
StopCar waitcar;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!这是为了使初始化顺利
InitStack(&waitcar);
int sumtime;//计算时间
if(stopcar->top ==-1)
printf("车库没有车!\n");
else if(IfTheCar(stopcar,carpai))
printf("车库里没有此车!\n");
else
{
while(stopcar->data[stopcar->top].carpai !=carpai)//这句话是什么意思 //妈的,还是对栈不理解 //是如何匹配的?
{
waitcar.data[waitcar.top+1].carpai =stopcar->data [stopcar->top ].carpai;
waitcar.data[waitcar.top+1].ch =stopcar->data [stopcar->top ].ch;
waitcar.data[waitcar.top+1].time =stopcar->data [stopcar->top ].time;
//我草,我还以为是用什么高级的转换呢,原来只是再赋值啊,不过这确实不错 !!!!!!
waitcar.top ++;
stopcar->top --; //这个牛啊,果然是因为我对栈不了解 ,出栈是很简单的
}
sumtime=time-stopcar->data [stopcar->top ].time;
printf("车牌是%d,在停车场停留的时间是%d,停车费用是%d\n",stopcar->data [stopcar->top ].carpai,sumtime, sumtime*cost);
stopcar->top --;//
while(waitcar.top !=-1) //什么时候用点,什么时候用->我有点分不清
{
stopcar->data [stopcar->top +1].carpai= waitcar.data [waitcar.top ].carpai;
stopcar->data [stopcar->top +1].ch= waitcar.data [waitcar.top ].ch;
stopcar->data [stopcar->top +1].time= waitcar.data [waitcar.top ].time;
waitcar.top --;
stopcar->top ++;
}
}
}
///StopCar *stopcar// Arriveparking//(StopCar *stopcar;BiandaoLink biandaocar;char ch;int car;int time)
//原来传递数值中只要有一项错误,那么就无法生成
void Arriveparking(StopCar *stopcar,BiandaoLink *biandaocar,char ch,int carpai,int time) //入库
{
int j=0;
BiandaoCar *bd;
bd->next =NULL;//不是,为什么用这个,我还没有见过用这个的啊;??????
if((stopcar->top+1)<n) //车库没有满
{
stopcar->data[stopcar->top +1].ch =ch;
stopcar->data[stopcar->top +1].carpai=carpai;
stopcar->data[stopcar->top +1].time =time;
stopcar->top ++;
printf("\n车牌号是%d的车停的位置是:%d\n",carpai,stopcar->top +1);
}
else
{
bd->data [j].carpai=carpai;
bd->data [j].ch=ch;
bd->data [j].time=time;
bd->next =NULL;//说起来为什么用bd ,这个语句代表什么
biandaocar->rear->next =bd;//”.”适用于结构体变量,”->”适用于结构体指针变量!!!!
biandaocar->rear =bd;
printf("车牌号是%d的车在便道上的位置是%d\n",carpai,j+1);//为什么j能代表位置啊
j++;
}
}
int IFtheCar(StopCar *stopcar,int carpai)
{
int i;
while(i<stopcar->top +1)//果然我现在还不能理解为什么j和top的对应关系????
{
if(stopcar->data [i].carpai==carpai) return 0;
i++;
}
return 1;
}
void InitStack(StopCar *stopcar)
{
stopcar->top =-1;
}
//说起来我知道为什么要建立两个函数去初始化栈了,因为一开始的栈名不一样
int InitQueue(BiandaoLink *biandaocar)
{
//biandaocar->front=(BiandaoCar)malloc(sizeof(BiandaoCar));
if(biandaocar->front!=NULL)
{
biandaocar->rear =biandaocar->front ;
biandaocar->front ->next=NULL;//是这样初始化的吗,总感觉哪里不对
return 0;
}
else return 1;
}
//反思:之前从来没有太注意 “.”以及”->”之间的区别,
//今天才发现有多么严重。”.”适用于结构体变量,”->”适用于结构体指针变量!!!!
int main(){
Car car;
StopCar stopcar;
//Biandao biandao;
BiandaoLink biandaocar;
int n;//停车场可以停放的最大车辆
int cost;// 每小时收取的费用
int time=1,carpai;
char ch;
//BiandaoCar biandaocar;
InitStack(&stopcar);
InitQueue(&biandaocar);
printf("输入停车场可以停放的最大车辆,以及每小时收取的费用 ");
scanf("%d %d",&n,&cost);
ch='q';//随便搞一个,使程序能进入循环 !!!!!!!!!!!!!!!!!
//妈的,这也他妈的太牛了吧!!!!
// 注意,当ch=' '时,要注意要 “吃掉 ”内存
// 接收第二个数之前清空缓冲区,fflush(stdin);getch();getchar();随便一个都可以,fflush(stdin)是全部清空,getchar()是清空一个字符,如果缓冲区还有多余的字符则会被正常使用,
while(ch!='E')
{
printf("\n请输入车的状态(A进站,D出站),车的车牌号,车的时间(进站时间,出站时间)(用空格间隔):");
scanf("%c %d %d",&ch,&carpai,&time);
if(ch=='A')
{
Arriveparking(&stopcar,&biandaocar,ch,carpai,time);
}
else if (ch=='D')
{
Leaveparking(&stopcar,ch,carpai,time);//从停车场离开
Biandaoparking(&stopcar,&biandaocar);//将便道上的车进入车库
}
else printf("请输入正确的编号,A是进库,D是出库!\n");
}
return 0;
}
停车场啊啊啊啊啊啊啊
最新推荐文章于 2024-09-09 17:57:44 发布
本文描述了一个C语言程序,使用顺序栈和链队实现了一个简单的停车场管理系统,包括车辆入库(Arriveparking)、出库(Leaveparking)、以及将便道上的车移入车库(Biandaoparking)的操作。
摘要由CSDN通过智能技术生成