关于“停车场问题”所做的总结
2015-11-03 23:49
267 查看
数据结构第二次上机作业。“停车场问题”
主要考察问题:
栈:
初始化栈
判断栈满
入栈
出栈
队列:
初始化链队列
判断链队列是否为空
链队列入队
链队列出队
总结细节问题:
string函数只能在C++函数中使用;
[b]使用时要包含头文件#include<iostream> [/b]
[b] #include<string>[/b]
[b] 要使用栈或者队列,用之前必须初始化栈或者队列;[/b]
[b] 在定义一个指针时,必须给他一个空间;[/b]
以下是源代码:
主要考察问题:
栈:
初始化栈
判断栈满
入栈
出栈
队列:
初始化链队列
判断链队列是否为空
链队列入队
链队列出队
总结细节问题:
string函数只能在C++函数中使用;
[b]使用时要包含头文件#include<iostream> [/b]
[b] #include<string>[/b]
[b] 要使用栈或者队列,用之前必须初始化栈或者队列;[/b]
[b] 在定义一个指针时,必须给他一个空间;[/b]
以下是源代码:
#include <stdio.h> #include <malloc.h> #include <string> #include <iostream> using namespace std; #define MAX 2 #define TRUE 1 #define FALSE 0 /******************************************/ /************** 结构体定义 ****************/ /******************************************/ typedef struct //车辆信息结构体 { string number; //车牌号码 int time; //到达时刻 }Car; typedef struct //顺序栈定义 { Car elem[MAX]; //车辆信息结构体指针 ////////////// int top; }SeqStack; typedef struct Node //链队列定义 { Car data; //车辆信息域 struct Node *Next; //指针域 }LinkQueueNode; typedef struct { LinkQueueNode *front; LinkQueueNode *rear; }LinkQueue; SeqStack garage;//车库 SeqStack quit;//暂退车道 LinkQueue thendrive;//便车道 /**********************************************/ /***************** 函数声明 *******************/ /**********************************************/ void InitStack(SeqStack *s);//初始化顺序栈 int IsEmpty(SeqStack *s);//判断栈满函数 int Push(SeqStack *s,int e);//入栈 int Pop(SeqStack *s,int *e);//出栈 void InitStack(SeqStack *s) { s->top=-1; } int IsEmpty(SeqStack *s) { if(s->top==-1) return TRUE; else return FALSE; } int Push(SeqStack *s,string number,int time) { if(s->top>=2) return FALSE; else { s->top++; s->elem[s->top].number=number; s->elem[s->top].time=time; } return TRUE; } int Pop(SeqStack *s,Car *e) { if(s->top==-1) return FALSE; else { e->number=s->elem[s->top].number; e->time=s->elem[s->top].time; s->top--; return TRUE; } } int InitQueue(LinkQueue *Q); int EmptyQueue(LinkQueue Q); int EnterQueue(LinkQueue *Q,string number,int time); int DeleteQueue(LinkQueue *Q,Car *x); int InitQueue(LinkQueue *Q) //链队列初始化 { Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode)); if(Q->front!=NULL) { Q->rear=Q->front; Q->front->Next=NULL; return TRUE; } else return FALSE; } int EmptyQueue(LinkQueue *Q) //判断链队列是否为空 { if(Q->front==Q->rear) return TRUE; else return FALSE; } int EnterQueue(LinkQueue *Q,string number,int time) //链队列入队操作 { LinkQueueNode *NewNode; NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode)); if(NewNode!=NULL) { NewNode->data.number=number; NewNode->data.time=time; NewNode->Next=NULL; Q->rear->Next=NewNode; Q->rear=NewNode; return TRUE; } else return FALSE; //溢出 } int DeleteQueue(LinkQueue *Q,Car *x) //链队列出队操作 { LinkQueueNode *p; if(Q->front==Q->rear) return FALSE; p=Q->front->Next; Q->front->Next=p->Next; if(Q->rear==p) Q->rear=Q->front; (*x)=p->data; free(p); return TRUE; } /**********************************************/ void Come(string Number,int Time);//车辆到达函数 void Leave(string Number,int Time);//车辆离开函数 void Come(string Number,int ComeTime) { if(garage.top<2) { Push(&garage,Number,ComeTime); } else { EnterQueue(&thendrive,Number,ComeTime); } cout<<Number<<"当前停放在车库"<<garage.top+1<<endl; } void Leave(string Number,int LeaveTime) { Car *e=new(Car); int cost;//停车费用 while((!IsEmpty(&garage))&&((garage.elem[garage.top].number)!=Number))//当"车库"栈不空,并且栈顶车辆不是要离开的车 { Pop(&garage,e);//将"车库"栈的栈顶车辆退出 Push(&quit,e->number,e->time);//让退出的车辆进入"暂时退车道"栈 } Pop(&garage,e); cost=(LeaveTime-e->time)*5; //将"暂时退车道"栈中的车辆倒回"车库"栈 while(!IsEmpty(&quit)) { Pop(&quit,e); Push(&garage,e->number,e->time); } if(!EmptyQueue(&thendrive)) { DeleteQueue(&thendrive,e);//队头车辆出队 e->number=LeaveTime; Push(&garage,e->number,e->time); } cout<<Number<<"停放时间为"<<LeaveTime-e->time<<"停车费用为"<<cost<<"元"<<endl; } void main () { int A; string Number; int Time; InitStack(&garage); InitStack(&quit); InitQueue(&thendrive); printf("请输入车辆信息(到达/离开,牌照号码,当前时刻):"); cin>>A; while(A!=-1) { cin>>Number>>Time; if(A==1) { Come(Number,Time); } else Leave(Number,Time); cin>>A; } }
相关文章推荐
- c++11特性之std::thread--进阶
- Codeforces Round #328 (Div. 2) A. PawnChess
- POJ 1456 Supermarket
- NAT的转化
- NAT的转化
- poj3368 Frequent values
- cocos2d-x 3.x addEventListenerWithSceneGraphPriority第二个参数的作用
- powerdesigner逆向导出oracle数据库结构显示备注
- p7zip的解压和压缩
- tomcat原理及安装及反向代理、会话保持、session集群和session共享服务器的实现(一)
- NAT的转化
- linux 常用基础命令 echo 详细介绍
- IOS UIButton
- 功能框架的补充
- SFTP环境搭建及客户代码调用公共方法封装
- Android 开发中,有哪些坑需要注意
- HDU 5527 Too Rich 贪心
- bzoj1636&bzoj1699【Usaco2007 Jan】Balanced Lineup
- Android-常用第三方库proguard-rules配置
- C++搜索引擎—Xapian中文简介