还有,怎么把上面的和下面的合二为一,满足题目要求?
#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;
}
}
}