试题描述:

设停车场只有一个可停放几辆汽车的狭长通道,只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车辆开走,则排在便道上的第一辆汽车即可进入;当停车场内某辆汽车要开走时,由于停车场是狭长的通道,在它之后开入的车辆必须先推出车场为他让路,待车辆开出大门,为他让路的车辆再按原次序进入车场。试设计这样一个停车场模拟管理程序,要求有运行结果截图。

要求:

(1)车辆进入要有登记;并自动给车辆编号;记录车辆停靠状态。

定义结构体,并且车位MAX==5;

typedef struct NODE
{CarNode *stack[MAX+1];int top;
}SeqStackCar;//用栈定义,构造停车场
typedef struct car
{CarNode*data;struct car*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedef struct Node
{QueueNode *head,*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道

(2)当停车场的停车位上都已停满了汽车,又有新的汽车到来时要把它调度到便道上,便道上的车辆要按照进入便道的前后顺序顺次序放在便道上,为便道上的每个位置分配一个固定的编号。当有车从停车位上离开后,便道上的第一辆汽车就立即进入停车位上的某个车位。

typedef struct NODE
{CarNode *stack[MAX+1];int top;
}SeqStackCar;//用栈定义,构造停车场
typedef struct car
{CarNode*data;struct car*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedef struct Node
{QueueNode *head,*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道

代码如下:(此代码有修改,不能直接运行,修改错误即可)

#include<iostream>
#include<string>
using namespace std;#define MAX 5
#define print 0.05
typedef struct time
{int hour,min;
}Time;
typedef struct node
{string num;Time reach,leave;
}CarNode;//结构体:定义每辆车的牌号,车辆状态我定义为:进入时刻与离开时刻
typedef struct NODE
{CarNode *stack[MAX+1];int top;
}SeqStackCar;//用栈定义,构造停车场
typedef struct car
{CarNode*data;struct car*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedef struct Node
{QueueNode *head,*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道void InitStack(SeqStackCar*);
int InitQueue(LinkQueueCar*);
int Reach(SeqStackCar*,LinkQueueCar*);
void Leave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);
void List(SeqStackCar,LinkQueueCar);
void PRINT(CarNode*p,int room);
int main()
{SeqStackCar Enter,Temp;//初始栈,中转栈LinkQueueCar Wait;//便道队列int a;InitStack(&Enter);InitStack(&Temp);InitQueue(&Wait);//初始化while(1){cout<<"            欢迎光临停车场!             "<<endl;cout<<"           1.车辆到达登记"<<endl;cout<<"           2.车辆离开登记"<<endl;cout<<"           3.车辆停靠查询"<<endl;cout<<"           4.退出系统"<<endl;//系统设置while(1){cin>>a;if(a>=1&&a<=4)break;else cout<<endl<<"请选择:1~4";}switch(a){case 1:Reach(&Enter,&Wait);break;case 2:Leave(&Enter,&Temp,&Wait);break;case 3:List(Enter,Wait);break;case 4:exit(0);default:break;}}}
void InitStack(SeqStackCar*s)//堆栈初始化
{s->top=0;s->stack[s->top]=NULL;
}
int InitQueue(LinkQueueCar*Q)//队列初始化
{Q->head=new QueueNode;if(Q->head!=NULL){Q->head->next=NULL;Q->rear=Q->head;return 1;}else return -1;
}
void PRINT(CarNode*p,int room)//输出离开停车场的车辆情况
{int A,B,C,D,price;cout<<"\n车辆离开的时间:"<<endl;cout<<"输入小时:";cin>>p->leave.hour;cout<<"输入分钟:";cin>>p->leave.min;cout<<"离开车辆的车牌号为:";cout<<p->num;cout<<endl<<"其到达时间为:"<<p->reach.hour<<":"<<p->reach.min;cout<<"离开时间为:"<<p->leave.hour<<":"<<p->leave.min;A=p->reach.hour;B=p->reach.min;C=p->leave.hour;D=p->leave.min;cout<<endl<<"应交费用为:"<<((C-A)*60+(D-B))*price<<"元"<<endl;cout<<"车辆离开登记完毕!"<<endl;cout<<"------------------------------------------------------"<<endl;delete p;
}
int Reach(SeqStackCar*Enter,LinkQueueCar*W)
{CarNode*p;   QueueNode*t;p=new CarNode;cout<<"-------------------------------------------------------"<<endl;cout<<"车辆到达登记开始:"<<endl;cout<<endl<<"请输入车牌号:";cin>>p->num;if(Enter->top<MAX)//如果车位未满则进入停车场{Enter->top++;cout<<endl<<"车辆在车场第"<<Enter->top<<"位置.";cout<<endl<<"车辆到达时间:"<<endl;cout<<"输入小时:";cin>>p->reach.hour;cout<<"输入分钟:";cin>>p->reach.min;cout<<endl<<"车辆到达登记完毕!"<<endl;cout<<"---------------------------------------------------"<<endl;Enter->stack[Enter->top]=p;return 1;}else//如果车位已满,则停在便道上{cout<<"----------------------------------------------------"<<endl;cout<<endl<<"该车须停靠在便道上,有车位时进入停车场"<<endl;t=new QueueNode;t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;return 1;}
}
void Leave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
{int room;CarNode *p,*t;QueueNode *q;if(Enter->top>0){while(1){cout<<"----------------------------------------------"<<endl;cout<<"车辆离开登记开始:"<<endl;cout<<endl<<"请输入车在车场的位置/1--"<<Enter->top<<"/:";cin>>room;if(room>=1&&room<=Enter->top)break;}while(Enter->top>room)//从停车场堆栈向中转堆栈移动车辆,直到要离开车辆的位置停止{Temp->top++;Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL; Enter->top--;}p=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1)//将中转堆栈中的车辆移到停车场堆栈{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}cout<<"-----------------------------------------------------"<<endl;cout<<"车辆离开登记结算:"<<endl;PRINT(p,room);if((W->head!=W->rear)&&Enter->top<MAX){q=W->head->next;t=q->data;Enter->top++;cout<<endl<<"便道的"<<t->num<<"号车进入车场第"<<Enter->top<<"位置."<<endl;cout<<"请输入"<<t->num<<"号车进入车场时间:"<<endl;cout<<"输入小时:";cin>>t->reach.hour;cout<<"输入分钟:";cin>>t->reach.min;W->head->next=q->next;if(q==W->rear)W->rear=W->head;Enter->stack[Enter->top]=t;delete q;}else cout<<endl<<"便道里没有车!"<<endl;}else cout<<endl<<"车场里没有车"<<endl;
}
void List1(SeqStackCar*S)//查看停车场内车辆情况的函数定义
{int i;if(S->top>0){cout<<"-----------------------------------------------------"<<endl;cout<<endl<<"车场内部车辆停靠情况:"<<endl;cout<<endl<<"位置       到达时间         车牌号"<<endl;for(i=1;i<=S->top;i++){cout<<i;cout<<"             "<<S->stack[i]->reach.hour<<":"<<S->stack[i]->reach.min;cout<<"             "<<S->stack[i]->num<<endl;}}else cout<<endl<<"车场里没有车"<<endl;cout<<"--------------------------------------------------------"<<endl;
}
void List2(LinkQueueCar*W)//查看便道上停靠车辆情况的函数定义
{QueueNode *p;p=W->head->next;if(W->head!=W->rear){cout<<"---------------------------------------------------"<<endl;cout<<endl<<"便道停靠车辆情况:"<<endl;while(p!=NULL){cout<<endl<<"车辆牌号:";cout<<p->data->num<<endl;p=p->next;}}else cout<<endl<<"便道里没有车。"<<endl;cout<<"--------------------------------------------------------"<<endl;
}
void List(SeqStackCar S,LinkQueueCar W)//车辆列表显示函数
{int flag,tag;flag=0;while(flag){cout<<"----------------------------------------------------"<<endl;cout<<"车辆停靠查询开始:"<<endl;cout<<endl<<"请选择 1|2|3: "<<endl;cout<<"1.车场列表"<<endl<<"2.便道列表"<<endl<<"3.返回主菜单"<<endl;while(1){cin>>tag;if(tag>=1||tag<=3)break;else cout<<endl;cout<<"请选择 1~3:";}switch(tag){case 1:List1(&S);cout<<"车辆停靠查询结束!"<<endl;break;case 2:List2(&W);cout<<"车辆停靠查询结束!"<<endl;break;case 3:flag=0;break;default:break;}}cout<<"-----------------------------------------------------"<<endl;
}

编译效果:

C语言数据结构问题:停车场问题(栈和队列)相关推荐

  1. C语言数据结构-第三章栈和队列-电大同步进度

    第三章栈和队列简介 从数据结构角度看,栈和队列是两种重要的线性结构,是一类操作受限制的特殊线性表,其特殊性在于限制插入和删除等运算的位置. 堆栈,限制用户只能在指定的一端插入和删除元素,因此具有后进先 ...

  2. 数据结构,堆和栈和队列的概念

    数据结构,堆和栈和队列的概念 1 什么是数据结构 数据结构是计算机存储,组织数据的反复改.数据结构是指相互之间存在的一种或多种特定关系的数据元素集合. 2 数据结构的逻辑结构 1 集合结构,元素都是孤 ...

  3. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

  4. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  5. 高一凡-数据结构第3章-栈与队列

    高一凡-数据结构第3章-栈与队列 3.1栈 3.1.1栈的数据结构 3.1.2接口 3.1.3实现 VS2015实例代码包: 3.1栈 3.1.1栈的数据结构 struct SqStack {SEle ...

  6. 数据结构-第三章-栈和队列(5)-链队

    数据结构 ⚡️数据结构-第一章 ⚡️抽象数据类型案例 ⚡️数据结构-第二章(1)-线性结构 ⚡️数据结构-第二章(2)-线性表的顺序表示和实现 ⚡️数据结构-第二章(3)-顺序表(含代码) ⚡️数据结 ...

  7. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  8. 【数据结构与算法】栈与队列【C语言版】

    目录 3.1 栈和队列的定义和特点 3.2 栈.队列与一般线性表的区别 3.3 栈的表示和操作的实现 顺序栈与顺序表 ================= 顺序栈的表示 顺序栈初始化 判断顺序栈是否为空 ...

  9. 《大话数据结构》读书笔记-栈与队列

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...

  10. 【数据结构与算法】栈与队列

    栈 一.什么是栈? 1.后进者先出,先进者后出,这就是典型的"栈"结构. 2.从栈的操作特性来看,是一种"操作受限"的线性表,只允许在端插入和删除数据. 二.为 ...

最新文章

  1. 做科研发论文一直找不到研究热点?硕博导师都在关注的平台你还不快来?
  2. boost::mp11::mp_clear相关用法的测试程序
  3. BYZ原创天语w806测评--入手2天,总结优点、缺点.
  4. TSAP传输服务访问点
  5. android 根据bounds坐标进行点击操作_炫酷的Android时钟UI控件,隔壁产品都馋哭了...
  6. sql批量插入数据mysql_MYSQL批量插入数据库实现语句性能分析
  7. Python自学真的可以学好嘛?
  8. 区块链网络安全平台Hapi Protocol将在Poolz上进行 IDO
  9. android timepicker分割线颜色,关于Android的TimePicker和DatePicker一些简单的使用问题
  10. Codeforces Round #503 (by SIS, Div. 2)
  11. 以高通camera 申请ion内存看dma-buf
  12. java复制数组函数_java 数组复制:System.arrayCopy 深入解析
  13. mouseclick
  14. 网络协议之ONVIF
  15. 软考网络工程师学习笔记
  16. 计算机音乐数字乐谱周杰伦,周杰伦的歌《安静》的数字乐谱是什么??
  17. PowerDesigner显示Comment注释
  18. 【 rbx1翻译 第七章、控制移动基座】第八节、使用里程计进行往返运动
  19. 刷新-读书笔记2(4-7章)
  20. Qt之实现动效导航栏

热门文章

  1. im即时通讯开发:进程被杀底层原理、APP应对被杀技巧
  2. java水平制表符_java中水平制表符\t的作用
  3. 深圳房产之一——直播思考
  4. 干货分享|原始记录的九点要求与注意事项
  5. JVM 三色标记 增量更新 原始快照 基本概念
  6. 郑州市信息技术类企业100强
  7. 郑州大学远程教育计算机专业英语,郑州大学远程教育专业英语考试.doc
  8. python批量爬取小说(一步一步实现,适合新手入门)
  9. 百度竞价如何理清思路?一张图让你明白!
  10. 物流管理项目思路理清。。