📄 车站管理.cpp
字号:
#define MAXROOM 5
#define StackSize MAXROOM
#define OK 1
#define ERROR 0
#define NULL 0
#include <iostream.h>
#include<stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct {//CARIF is the information of the car
int time;
int number;
}CARIF;//数据结构CARIF为车的时间和牌号
typedef struct {
CARIF *base;
CARIF *top;
int stacksize;
}SqStack;//栈数据结构
typedef struct QNode{
CARIF data;
struct QNode *next;
}QNode,*QueuePtr;//队列数据结构
typedef struct{
QueuePtr front;//对头指针
QueuePtr rear;//队尾指针
}LinkQueue;
unsigned InitQueue(LinkQueue &Q)//构造一个空队列Q
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)return ERROR;
Q.front->next=NULL;
return OK;
}
unsigned EnQueue(LinkQueue &Q,CARIF *e)
{
//插入元素到新的队尾元素将指针e所指的数据输入
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)return ERROR;
(p->data).number=e->number;
(p->data).time=e->time;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
unsigned Dequeue(LinkQueue &Q,CARIF &e){
//若队列不空,则删除Q的对头元素,用e返回其值
QueuePtr p;
if(Q.front==Q.rear)return ERROR;
p=Q.front->next;
e.number=(p->data).number;
e.time=(p->data).time;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
delete(p);
return OK;
}
unsigned InitStack(SqStack &s)
{//构造一个栈s
s.base=(CARIF * )malloc(MAXROOM*sizeof(CARIF));
if(!s.base)
{
cout<<"Init Stack Error!"<<endl;
return ERROR;
}
s.top=s.base;
s.stacksize=StackSize;
return OK;
}
unsigned Push(SqStack &s,CARIF *e){//将指针e所指的数据入站
if(s.top-s.base>=s.stacksize)
return ERROR;
(s.top)->time=e->time;
(s.top)->number=e->number;
s.top++;
return OK;
}
unsigned Pop(SqStack &s,CARIF *f){//若栈不空,则删除s的栈顶元素,用f返回其值,并删掉此数
if(s.top==s.base)
return ERROR;
else
s.top--;
f->time=s.top->time;
f->number=s.top->number;
return OK;
}
int StackLength(SqStack &s){//返回当前堆栈中元素个数
return (s.top-s.base);
}
unsigned StackTraverse(SqStack *SS)
{ CARIF *basetem;
CARIF *toptem;
int i;
basetem=SS->base;
toptem=SS->top-1;
printf("当前停车场的停车状况为\n");
for(i=MAXROOM;basetem<=toptem;i--)
{
printf("***停车场第%d个位置的车***\n",i);
printf("*****车牌号为%d*****\n",(toptem)->number);
printf("_____进站时间为%d______\n",(toptem)->time);
--toptem;
}
return OK;
}
unsigned recipt()
{
cout<<"||||||||||||||||||||||||"<<endl;
cout<<"|| 收据 ||"<<endl;
cout<<"|| ||"<<endl;
cout<<"|| *****元 ||"<<endl;
cout<<"||||||||||||||||||||||||"<<endl;
return 0;
}
void main()
{ SqStack s1,s2;
LinkQueue Q;
CARIF car,f;
char FLAG;
int i=0;
int j=0,flag1;
InitStack(s1);
InitStack(s2);
InitQueue(Q);
for(;;)
{
printf("车入站:A,车出站:D,查看站的当前信息:S\n");
cin>>FLAG;
switch(FLAG)
{
case 'A':
{
cout<<"请输入车牌号num,进站时间time\n"<<endl;cin>>car.number>>car.time;//如果此处输入字母不会出错
if(Push(s1,&car))
{cout<<"此车已经入站\n"<<"****其在车站的第"<<++i<<"个位置***"<<endl;}
else
{EnQueue(Q,&car);cout<<"此车已经进入便道\n"<<"######其在便道的第"<<++j<<"个位置###"<<endl;}
}
break;
case 'D':
{
cout<<"请输入车牌号\n"<<endl;cin>>car.number;
for(;(flag1=Pop(s1,&f))&&f.number!=car.number;)
{
Push(s2,&f);
}
if(!flag1){cout<<"无此车在站内,请重新输入!!!\n"<<endl;}
else {cout<<"***出站的车号为"<<f.number<<"***\n"<<"#####进站时间为"<<f.time<<"###\n"<<endl;
recipt();}
for(;Pop(s2,&f)>0;)//将刚才暂时存在第二个堆栈的数据重新弹回第一个堆栈
{Push(s1,&f);}
i--;
while(StackLength(s1)<s1.stacksize&&Dequeue(Q,f))//先判断堆栈是否为满
/*如果队列中有元素且堆栈未满则将第一个元素出队数据存在f中*/
{j--;Push(s1,&f);cout<<StackLength(s1)<<endl;}//将f中的元素弹入堆栈中
break;
}
case 'S': StackTraverse(&s1);break;
default : cout<<"抱歉,您的输入不正确,请重新输入!"<<endl;break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -