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

2023-11-10

试题描述:

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

要求:

(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;
}

编译效果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Linux shell判断含有通配符的文件是否存在

    方法一 使用 ls jpg gt dev null 命令 if ls jpg gt dev null then echo 当前文件夹下 未找到 jpg文件 else echo 当前文件夹下 存在 jpg文件 fi 方法二 使用 ls jpg
  • Descriptors cannot not be created directly

    1 Descriptors cannot not be created directly 在运行诸如深度学习python等程序时 如mmdetection mmdetection3d中的程序 会出现报错 Descriptors cannot
  • 后氧传感器正常数据_氧传感器电压多少正常?氧传感器数据流分析介绍

    氧传感器作用是什么 氧传感器用以检测排气中氧的浓度 并向ECU发出反馈信号 再由ECU控制喷油器喷油量的增减 从而将混合气的空燃比控制在理论值附近 氧传感器是利用陶瓷敏感元件测量汽车排气管道中的氧电势 由化学平衡原理计算出对应的氧浓度 达到
  • Redis启动与关闭

    安装redis之后 在命令行窗口中输入 redis server redis windows conf 启动redis 关闭命令行窗口就是关闭 redis redis作为windows服务启动方式 redis server service

随机推荐

  • Xilinx_RAM_IP核的使用

    Xilinx RAM IP核的使用 说明 单口RAM 伪双口RAM 双口RAM的读写 以及RAM资源占用的分析 环境 Vivado2018 3 IP核 Block Memory Generator 参考手册 UG473 7 Series F
  • 人力资源平台项目总结(2)

    目录 1 路由和页面 1 1 左侧菜单的显示逻辑 设置菜单图标 重点 2 组织架构 2 1 认识组织架构 2 2 将树形的操作内容单独抽提成组件 2 3 获取组织架构数据 并进行树形处理 重点 2 4 删除部门功能实现 2 5 新增部门功能
  • 使用presto+airpal+hive打造即席查询工具

    0X01 前言 即席查询怎么做 怎么选型 这次用的是presto来做尝试 缘起 公司是Impala的深度用户 我主要负责Impala的各方面的工作 最近因为一些特殊原因需要对现有的体系进行一些调整 需要做出来即席查询的组件 在spark s
  • 基于matlab的多元线性回归分析

    二 多元线性回归原理 2 1 数学模型 在社会生活及生产实践中会经常遇到一种问题 即我们非常关注一个量的变化 而这个量受到另一个或是多个因素的影响 我们想要了解这些因素是如何影响我们最为关注的这个量的以及这些因素对我们最为关注的这个量的影响
  • 【C语言进阶】实现atoi函数

    1 函数介绍 atoi的函数功能 将string所指向数字字符串转化为整数 注意 1 会跳过前面的空白字符 例如空格 tab缩进 等 2 如果不能转换成 int 或者为空字符串 那么将返回 0 特别注意 该函数要求被转换的字符串是按十进制数
  • 数字图像处理-小波变换小白解释基本原则

    内容完全转载 小波理论的基本概念及概述 第二版 欢迎阅读此份关于小波变换的入门教程 小波变换是一个相对较新的概念 其出现大约是在20世纪80年代 但是有关于它的文章和书籍却不少 这其中大部分都是由数学专业人士写给其他同行看的 不过 仍然有大
  • Java解析cron表达式

    概述 Cron表达式是一个字符串 以5或6个空格隔开 分为6或7个域 每一个域代表一个含义 即两种语法格式 Seconds Minutes Hours DayofMonth Month DayofWeek Year 即 秒 分 时 天 月
  • rp学习1---web页面左侧导航栏收缩

    一 首先使用几个矩形框将所有的导航栏按照需要和层级画出来 如下 二 将父菜单和子菜单分别转化为动态面板 具体转化动态面板方式如下 选择要转为面板的部分 如两个子菜单 鼠标画框框住两个菜单即可 会将框内的所有内容作为一个面板 右击 三 选择父
  • 算法训练营第三十二天(8.16)

    目录 Leecode 435 Non overlapping Intervals Leecode 763 Partition Labels Leecode 56 Merge Intervals Leecode 435 Non overlap
  • pycharm问题求解

    为什么我的pycharm下面会弹出在 init 中找不到某个函数 我不知道在哪里设置了这个就都成这个样子了 重新安装一个模组可以暂时解决这个问题 但是切个屏就又变成这样了 正常的好像是这样的 求解
  • graph 图数据结构

    树 和 图 辨析 1 树的父节点和子节点之间是一条路单向可达 2 图的的节点之间存在多条路可达 基本概念 1 顶点 2 边 3 邻居节点 只有一条边连接的顶点 4 度 degree 一个顶点有几条边 就有几度 图的区分 1 无向图 边没有方
  • 【Shell】expect解决脚本中交互时自动输入的问题

    日常和shell相关的工作中 经常遇到要在脚本中连接其他服务器进行文件传输等操作 这些命令通常会要求和用户交互输入验证 信息 那么在脚本中如何实现自动输入口令之类的信息 这里就要用到expect 以ubuntu20为例 首先要安装这个软件
  • Unity Animancer插件(三)运动

    一 根运动 Animancer的根运动系统与原生的工作原理完全相同 但我们可以通过继承Transition类型或实现ITransition接口 来将额外的数据与动画绑定 从而更方便地控制根运动 在下面这个示例中 我们通过自定义的Transi
  • 从N个整数中判断是否有三个整数能组成三角形

    解决这个问题 可以用斐波那契数列 Fibonacci sequence 原因 斐波那契数列中的数是不可能组成三角形的 而我们只要在这些数列里面加一个数就可以有一个三角形可以组成 有了这个原因我们就可以写一个非常快速就可以判断出结果的函数 如
  • C#:递归汉诺塔

    一 运行效果截图 二 实验要求 如果n 1 直接将金片从A针移到C针上 函数输出 Form A to C 如果n gt 1时 移动过程分解为以下几个步骤 1 将A上的n 1片金片借助C针移到B针上 2 把A针上剩下的一片金片由A针移到C针上
  • stomp.min.js(stomp协议的客户端脚本)、sockjs.min.js(SockJS的客户端脚本)以及jQuery

    stomp min js stomp协议的客户端脚本 sockjs min js SockJS的客户端脚本 以及jQuery 点击打开链接
  • [ C++ ] — 智能指针

    一 三种智能指针 auto ptr unique ptr shared ptr auto ptr是C 98提供的方案 C 11已经将其摒弃 以下只是示例 实际不要使用auto ptr 使用new和delete管理动态内存常出现的问题 1 忘
  • STM32MP1开发环境搭建

    STM32MP1 wiki教程 stm32mpu 按照教程的介绍 开发MPU需要在linux环境下 一般选择在VMware虚拟机环境下安装Ubuntu 安装步骤 1 安装VMware 我安装的是VMware 10 0 0 链接 https
  • jQuery使用手册

    官方网站 http jquery com jQuery是一款优秀js开发库类 特别是对css和XPath的支持 使我们写js变得更加方便 如果你不是个js高手又想写出优 秀的js效果 jQuery可以帮你达到目的 下载地址 Starterk
  • C语言数据结构问题:停车场问题(栈和队列)

    试题描述 设停车场只有一个可停放几辆汽车的狭长通道 只有一个大门可供汽车进出 汽车在停车场内按车辆到达的先后顺序依次排列 若车场内已停满几辆汽车 则后来的汽车只能在门外的便道上等候 一旦停车场内有车辆开走 则排在便道上的第一辆汽车即可进入