⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 29135554949.cpp

📁 设停车场是一个可停放n辆汽车的狭长通道
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define OK 1
#define NULL 0
#define ERROR 0
#define OVERFLOW 0
#define STACK_INIT_SIZE 2 //停车场大小

typedef struct{
	char AorD;       //表示车到达或离去的信息  
	char num[10];    //表示车的车牌号码
	int time;        //表示车到达或离开的时间
}ElemType;
typedef struct{      //定义栈的结构体
	ElemType *base;  //在栈构造之前和销毁之后,base的值为null
	ElemType *top;   //栈顶指针
	int stacksize;   //当前已分配的存储空间
}SqStack;
typedef struct QNode{  
	ElemType cardata;
	struct QNode *next;
}QNode,*Queueptr;
typedef struct{      //定义队的结构体
	Queueptr front;  //队头指针
	Queueptr rear;   //队尾指针
}LinkQueue;

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){//插入元素e为新的栈顶元素
	*s.top++=e;
	return OK;
}//Push
unsigned pop(SqStack &s,ElemType &e){//若栈不空,则删除S的栈顶元素,用e返回其值并返回OK;否则返回ERROR;
	if(s.top==s.base)return ERROR;
	e=*--s.top;
	return OK;
}//pop
void Delete(SqStack &s,ElemType e){//若栈不空,则删除S中元素为e的元素
	ElemType m[20],n,g;
	int a,i=0;
	while(s.base!=s.top){
        g=*--s.top;
		s.top++;
		if(strcmp(g.num,e.num)==0)
			pop(s,n);
		else
			pop(s,m[i++]);
		    
	}
	for(a=0;a<i;a++)
		Push(s,m[a]);
}
unsigned FullStack(SqStack s){//判断栈是否满
	if(s.top-s.base>=s.stacksize)
		return OK;
	else 
		return ERROR;
}//FullStack
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=new QNode;
	if(!p)exit(OVERFLOW);
	p->cardata=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	return OK;
}//EnQueue
unsigned EmptyQueue(LinkQueue Q){//判断队列是否为空
	if(Q.front==Q.rear)
		return OK;
	else
		return ERROR;
}//EmptyQueue
unsigned DeQueue(LinkQueue &Q,ElemType &e){//若队列不空,则删除Q的对头元素,并用e返回其值
	Queueptr p;
	if(!EmptyQueue(Q))
	{
	    p=Q.front->next;
	    e=p->cardata;
	    Q.front->next=p->next;
	    if(Q.rear==p)
		  Q.rear=Q.front;
	      free(p);
	      return OK;
	}
   else
	  return ERROR;
}//DeQueue
unsigned 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 OK;
	}
	return ERROR;
}//SeekStack
void StackTrverse(SqStack s){//输出栈中的元素
		ElemType m;
	while(s.top!=s.base){
		m=*(--s.top);
		printf(" %s           %d\n",m.num,m.time);
	}
}
unsigned SeekQueue(LinkQueue &Q,ElemType e,ElemType &n){//查找队中是否有和e相同号码的这个元素,若有则返回OK,否则返回ERROR,并用n返回这个元素
	Queueptr p,q;
	p=Q.front;
	while(p->next){
		if(strcmp(p->next->cardata.num,e.num)==0){
			n=p->next->cardata;
			q=p->next;
            p->next=q->next;
			free(q);
			return OK;
		}
		else
			p=p->next;
	}
	return ERROR;
}//SeekQueue
void QueueTrverse(LinkQueue Q){//输出队列中的元素
    Queueptr p;
	p=Q.front;
	while(p->next){
		printf(" %s           %d\n",p->next->cardata.num,p->next->cardata.time);
		p=p->next;
	}
}
void main(){//主函数
	int i=1,m=1,n=1,totaltime;
    ElemType e,f,g,k;
	SqStack s;
	LinkQueue Q; 
    InitStack(s);
	InitQueue(Q);
    printf("*******************停车场 管理系统******************\n");
	printf("*****车停在停车场内0.5元每分钟,停在便道上免费******\n\n");
    printf("(A:表示ARRIVAL  D:表示DEPARTURE  E:表示END)\n");
	for(i=1;;i++)
	{
        printf("\n请输入车辆信息:A/D/E  车牌号码   到达/离开时间\n\n");
        fflush(stdin);
        scanf("%c%s%d",&e.AorD,&e.num,&e.time);	  
        if(e.AorD=='A')
		{
	        if(SeekStack(s,e,f))//查找栈中是否有和e相同号码的这个元素(车)
			{
		        printf("你输入的车牌号码有误(与停车场内的车有相同的),请重新输入:\n");
                i--;
			}
	        else{
		          if(!FullStack(s))
				  {
				     Push(s,e);
				     printf("请将车停在停车场的第%d个位置\n\n",m++);
                   printf("\n现在停车场内的车有:\n");
				     printf("车牌号码    停入停车场的时间\n\n");
				     StackTrverse(s);
                   printf("\n现在便道上的车有:\n");
			         printf("车牌号码    停入便道上的时间\n\n");
			         QueueTrverse(Q);
				  }
		          else{
		                 if(SeekQueue(Q,e,k))//查找队中是否有和e相同号码的这个元素(车)
						 {
			                 printf("你输入的车牌号码有误(与便道上的车有相同的),请重新输入:\n");
			   	             i--;
						 }
		                 else
						 {
			                 EnQueue(Q,e);
			                 printf("停车场已满,请将车停在便道的第%d个位置\n",n++);
			                 printf("\n现在停车场内的车有:\n");
			                 printf("车牌号码    停入停车场的时间\n\n");
			                 StackTrverse(s);
			                 printf("\n现在便道上的车有:\n");
			                 printf("车牌号码    停入便道上的时间\n\n");
			                 QueueTrverse(Q);
						 }
				  }
			}
		}
	    if(e.AorD=='D')
		{
			if(SeekStack(s,e,f))//查找栈中是否有和e相同号码的这个元素(车)
			{
				Delete(s,f);
				m--;
				totaltime=e.time-f.time;
				printf("你的车在停车场内停留了%d分钟\n", totaltime );
				printf("你应付停车费%.2f元\n\n",totaltime*0.5);

				if(!EmptyQueue(Q)){
					DeQueue(Q,g);
					g.time=e.time;
				    Push(s,g);
					m++;
					n--;
				    printf("\n现在停车场内的车有:\n");
			     	printf("车牌号码    停入停车场的时间\n\n");
			       StackTrverse(s);
                  printf("\n现在便道上的车有:\n");
			       printf("车牌号码    停入便道上的时间\n\n");
			       QueueTrverse(Q);
				}
			}
			else
			{
				if(SeekQueue(Q,e,k)){//查找队中是否有和e相同号码的这个元素(车)
		        totaltime=e.time-k.time;
				printf("你的车在便道上停留了%d分钟\n",totaltime);
				printf("你不用缴纳停车费\n\n");
                n--;
				printf("\n现在停车场内的车有:\n");
				printf("车牌号码    停入停车场的时间\n\n");
			    StackTrverse(s);
                printf("\n现在便道上的车有:\n");
			    printf("车牌号码    停入便道上的时间\n\n");
			    QueueTrverse(Q);
				}
				else
					printf("你的输入有误(停车场和便道上都没有此车),请重新输入:\n");
			}
		}
	    if(e.AorD=='E')
		{
	     	printf("输入结束,请按任意键结束.\n");
	        break;
		}
	}
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -