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

📄 车站管理.cpp

📁 数据结构课程设计
💻 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 + -