📄 tingchechangguanlixitong.txt
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"
#include"iostream.h"
#define stack_init_size 10
#define stackincrement 10
#define OK 1
#define NULL 0
#define ERROR 0
#define OVERFLOW 0
#define chewei 5 //停车场车位个数
typedef struct{
char AorD; //表示车到达或离去的信息
char num[10]; //表示车的车牌号码
int time; //表示车到达或离开的时间
}ElemType;
//栈
typedef struct{ //定义栈的结构体
ElemType *base;
ElemType *top;
int stacksize; //当前已分配的存储空间
}SqStack;
unsigned InitStack(SqStack &S)
{//新建空栈
S.base=(ElemType *)malloc(stack_init_size *sizeof(ElemType));
if(!S.base)exit(OVERFLOW); //存储分配失败
S.top=S.base;
S.stacksize=stack_init_size;
return OK;
}//InitStack
unsigned push(SqStack &S,ElemType e){//在栈中插入元素。
if((S.top-S.base)>=S.stacksize){//栈满 追加空间
S.base=(ElemType *)realloc(S.base,(S.stacksize+stackincrement) * sizeof(ElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
}
*S.top++ =e;
return OK;
}
unsigned pop(SqStack &S,ElemType &e)
{//出栈
if(S.top ==S.base)return ERROR;
e= * --S.top;
return OK;
}
int SeekStack(SqStack S,ElemType e,ElemType &m)
{//查找栈中是否和e有相同号码的这个元素,若有则返回OK,否则返回ERROR,并用m返回这个元素
while(S.top!=S.base){
m=*(--S.top);
if(strcmp(m.num,e.num)==0)
return 1;
}
return 0;
}//SeekStack
int length(SqStack S)
{ //栈
return S.top - S.base;
}
void Delete(SqStack &S,ElemType e)
{ //若栈不空,则删除S中元素为e的元素
int len;
int k;
ElemType g,m,h;
SqStack R;
g=*--S.top;
k=SeekStack( S, e,m);
if(k!=0)
{ InitStack( R);
while(strcmp(g.num,e.num))
{ S.top++;
pop(S, h);
push( R, h);
g=*--S.top;
}
pop( S, h);
cout<<h.num<<"车已顺利离开停车场";
len=length( R);
for(int i=1;i<=len;i++)
{ pop(R,h);
push(S, h);
}
}
}
// 队列
typedef struct QNode{
ElemType cardata;
struct QNode *next;
}QNode,*Queueptr;
typedef struct{ //定义队的结构体
Queueptr front; //队头指针
Queueptr rear; //队尾指针
}LinkQueue;
unsigned InitQueue(LinkQueue &Q){//构造一个空队列
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
if(!Q.front)exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}//InitQueue
unsigned EnQueue(LinkQueue &Q,ElemType e)
{//插入元素e为Q的新的队尾元素
Queueptr p;
p=(Queueptr)malloc(sizeof(QNode));
if(!p)exit(OVERFLOW);
p->cardata=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
if(Q.front->next==NULL)
Q.front->next=p;
return OK;
}
unsigned DeQueue(LinkQueue &Q,ElemType &e)
{//若队列不空,则删除Q的对头元素,并用e返回其值
Queueptr p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e=p->cardata;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return OK;
}
int Extent(LinkQueue Q)
{ //取得队列的长度
if(Q.front->next==NULL)
return 0;
else if(Q.front->next==Q.rear)
return 1;
else {
Queueptr h;
h=Q.front->next;
for(int n=1;h->next;n++)
{h=h->next;}
return n;
}
}
unsigned SeekQueue(LinkQueue &Q,ElemType e,ElemType &n)
{//查找队中是否有和e相同号码的这个元素,若有则返回OK,否则返回ERROR,并用n返回这个元素
Queueptr p;
p=Q.front;
while(p->next){
if(strcmp(p->next->cardata.num,e.num)==0)
{
n=p->next->cardata;
return OK;
}
else
p=p->next;
}
return ERROR;
}
void StackTrverse(SqStack S)
{ //输出栈中元素
ElemType m;
if(S.top==S.base)
cout<<"停车场内没有车辆\n";
else{
while(S.top!=S.base)
{m=* (--S.top);
cout<<m.num<<" ";
cout<<m.time<<endl;
}
}
}
void QueueTrverse(LinkQueue Q)
{//输出队列中的元素
Queueptr p;
p=Q.front;
if(Q.front->next==NULL){return;}
else
{while (p->next)
{ cout<<p->next->cardata.num<<" ";
cout<<p->next->cardata.time<<endl;
p=p->next;
}
}
}
long convert(char a[10])
{ //输入把字符转化成数字
long result=0;
for (int i=0;i<10;i++)
{ if(a[i]=='\0') break;
if(a[i]<'0'||a[i]>'9')
{return -1;}
result=result*10+a[i]-48;
}
return result;
}
void main()
{//主函数
int i=1,m=1,n=1,totaltime=0;
ElemType e,f,g,h,r;
long k;
SqStack s;
LinkQueue Q;
InitStack(s);
InitQueue(Q);
cout<<"*******************停车场 管理系统******************\n";
cout<<"*****车停在停车场内0.2元每分钟,停在便道上免费";
cout<<"*****\n\n";
cout<<"(A:表示ARRIVAL D:表示DEPARTURE E:表示END)\n";
for(i=1;;i++)
{cout<<"\n请输入车辆信息:A/D/E 车牌号码 到达/离开时间\n\n";
loop: cin>>e.AorD>>e.num>>e.time;
k=convert( e.num);
if(k==-1)
{cout<<"输入错误,车牌号必须是数字,请重新输入\n";
goto loop;
}
if(e.AorD=='A')
{
if(SeekStack(s,e,f))//查找栈中是否有和e相同号码的这个元素(车)
{cout<<"你输入的车牌号码有误(与停车场内的车有相同的),请重新输入:\n";
goto loop;
}
else{
if(length(s)<5)
{
push(s,e);
cout<<"请将车停在停车场的第"<<length(s)<<"个位置\n\n";
cout<<"\n现在停车场内的车有:\n";
cout<<"车牌号码 停入停车场的时间\n\n";
StackTrverse(s);
cout<<"\n现在便道上没有车\n";
}
else{
if(SeekQueue(Q,e,r))
{//查找队中是否有和e相同号码的这个元素(车)
cout<<"你输入的车牌号码有误(与便道上的车有相同的),请重新输入:\n";
goto loop;
}
else
{ EnQueue(Q,e);
cout<<"停车场已满,请将车停在便道的第"<<Extent(Q)+1<<"个位置\n";
cout<<"\n现在停车场内的车有:\n";
cout<<"车牌号码 停入停车场的时间\n\n";
StackTrverse(s);
cout<<"\n现在便道上的车有:\n";
cout<<"车牌号码 停入便道上的时间\n\n";
QueueTrverse(Q);
}
}
}
}
if(e.AorD=='D')
{ if(SeekStack(s,e,f))
{//查找栈中是否有和e相同号码的这个元素(车)
Delete(s,f);
totaltime=e.time-f.time;
cout<<"你的车在停车场内停留了"<<totaltime<<"分钟\n";
cout<<"你应付停车费"<<totaltime*0.2<<"元\n\n";
if(Extent(Q))
{
DeQueue(Q,g);
g.time=e.time;
push(s,g);
cout<<g.num<<"车已停入停车场,计费开始.\n\n";
cout<<"\n现在停车场内的车有:\n";
cout<<"车牌号码 停入停车场的时间 \n\n";
StackTrverse(s);
cout<<"\n现在便道上的车有:\n";
cout<<"车牌号码 停入便道上的时间 \n\n";
QueueTrverse(Q);
}
else;
}
else
{
if(SeekQueue(Q,e,h))
{//查找队中是否有和e相同号码的这个元素(车)
if(strcmp(Q.front->next->cardata.num,h.num))
cout<<"请稍等,您的车在便道上无法直接开出来,请联系停车场管理员。\n\n";
else
{totaltime=e.time-h.time;
DeQueue(Q,e);
cout<<"你的车在便道上停留了"<<totaltime<<"分钟\n";
cout<<"你不用缴纳停车费\n\n";
}
cout<<"\n现在停车场内的车有:\n";
cout<<"车牌号码 停入停车场的时间\n\n";
StackTrverse(s);
cout<<"\n现在便道上的车有:\n";
cout<<"车牌号码 停入便道上的时间\n\n";
QueueTrverse(Q);
}
else
{cout<<"你的输入有误(停车场和便道上都没有此车),请重新输入:\n";
goto loop;
}
}
}
if(e.AorD=='E')
{ cout<<"输入结束,请按任意键结束.\n";
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -