怎么运用我这种设计栈和队列去增加一个根据车牌号去查该车在停车场或便道的位置的这样一个功能
#include
using namespace std;
int position = 0;//车在 便道 上的位置
int Count = 0;//统计便道上的车辆数做数组下标
int stopTime = 0;//记录车子 在便道上停留 的时间
int startTime = 0;//记录车子 刚进入便道 的时间
//栈
typedef struct
{
int carNumber[100]; //车牌号,最多100个
int arriveTime[100];//到达时间,对应各个车
int top;//停车场车位位置
int size;//停车场车位数量
} Stack;
//队列
typedef struct qNode
{
int carNumber;//车牌号
int arriveTime;//到达时间
int position;//车在 便道 上的位置
struct qNode *next;
} qNode, *queue;
typedef struct
{
queue front;
queue rear;
} Queue;
//初始化栈
void initStack(Stack &S, int size)
{
S.top = -1;
S.size = size;
}
//检测栈空
bool emptyStack(Stack &S) {
if (S.top == -1)
return false;
else
return true;
}
//检测栈满
bool fullStack(Stack &S)
{
if (S.top == S.size - 1)
return false;
else
return true;
}
//入栈
void push(Stack &S, int carNumber, int arriveTime)
{
S.top++;
S.carNumber[S.top] = carNumber;
S.arriveTime[S.top] = arriveTime;
}
//出栈
void pop(Stack &S, int &carNumber, int &arriveTime)
{
carNumber = S.carNumber[S.top];
arriveTime = S.arriveTime[S.top];
S.top--;
}
//初始化队列
void initQueue(Queue &Q) {
Q.front = Q.rear = (queue)malloc(sizeof(qNode));//队头指针、队尾指针指向同一空结点
if (!Q.front) {
exit(-1);//内存分配失败,退出
}
Q.front->next = NULL;
}
//判断队列是否为空
bool emptyQueue(Queue &Q)
{
if (Q.front == Q.rear)
return false;
else
return true;
}
//入队列
void inQueue(Queue &Q, int carNumber, int arriveTime)
{
queue p;
p = (queue)malloc(sizeof(qNode));//分配一个结点空间
p->carNumber = carNumber;
p->arriveTime = arriveTime;
p->next = NULL;
Q.rear->next = p;//队尾指针指向p
Q.rear = p;//队尾指针后移一位
position++;
}
//出队列
void outQueue(Queue &Q, int &carNumber, int &arriveTime)
{
queue p;
p = (queue)malloc(sizeof(qNode));//分配一个结点空间
p = Q.front->next;//指定一个新的结点指向队头指针指向的结点
carNumber = p->carNumber;//返回结点数据值
arriveTime = p->arriveTime;
Q.front->next = p->next;//将p指向的下一数据给队头指针,令下一数据前移到队头
if (Q.rear == p)
Q.rear = Q.front;//使队尾指针回到初始位置
delete(p);//释放p所指结点空间
position--;//车在便道的位置 向前移动
}
//判断停车场内是否已有车辆,避免重复输入相同车牌号的车
bool judge_Parking(Stack S, char state, int carNumber) {
int i = S.top;
if (state != 'A')
return true;//只用判断 A(输入) 情况
while (i != -1)
{
if (carNumber == S.carNumber[i])
{
cout << "停车场里已经有该车,请重新进入输入界面!\n";
return false;
}
i--;//逐个遍历
}
return true;
}
//判断便道上是否已有车辆,避免重复输入相同车牌号的车
bool judge_Accessroad(Queue Q, char state, int carNumber)
{
if (state != 'A')
return true;//只用判断 A(输入) 情况
queue p = Q.front->next;//指定一个新的结点指向队头指针指向的结点
while (p != NULL)
{
if (carNumber == p->carNumber)
{
cout << "便道上已经有该车,请重新进入输入界面!\n";
return false;
}
p = p->next;//逐个遍历
}
return true;
}
//1.车辆 进/出 停车场
void load(Stack &S, Stack &LS, Queue &Q, int parkingFee, int time[])
{
int carNumber, arriveTime;
char state;//状态描述
cout << "请输入车的状态(A进站/D出站),车牌号(整数) 和 时间整数(进站时间/出站时间):\n输入 E 0 0 结束输入\n\n";
cin >> state >> carNumber >> arriveTime;
while ((judge_Parking(S, state, carNumber)) && (judge_Accessroad(Q, state, carNumber)) && state != 'E') {
int leaveTime = arriveTime;
if (state == 'A')
{
//停车场是否为空
if (fullStack(S))
{
push(S, carNumber, arriveTime);//车进入停车场
cout << "车牌号是 " << carNumber << " 的车停在停车场的位置是 " << S.top + 1 << endl;
}
else
{
//记录车子 刚进入便道 的时间
startTime = arriveTime;
//记录便道车牌号
time[Count] = carNumber;
Count++;
//便道不计费,因此初始默认数值为 常数 0
inQueue(Q, carNumber, arriveTime);//停车场非空,停在便道上
cout << "车牌号是 " << carNumber << " 的车在便道的位置是 " << position << endl;
}
}
else if (state == 'D')
{
//查询该车
bool yes = false;
bool is = false;
//无该车
for (int i = 0; i <= S.top; i++)
{
if (S.carNumber[i] == carNumber)
{
is = true;
break;
}
}
if (!is)
{
cout << "停车场无车牌号为 " << carNumber << " 的车!" << endl;
}
for (int j = S.top; j >= 0; j--)
{
if (!is)
{
break;//停车场内无车,跳出循环
}
if (S.carNumber[j] != carNumber)
{
pop(S, carNumber, arriveTime);
push(LS, carNumber, arriveTime);
if (S.top == 0)
{
yes = true;
break;
}
}
else
{
yes = true;
break;
}
}
if (yes)
{
bool to = true;
//找到了该车
pop(S, carNumber, arriveTime);//该车离开停车场
for (int i = 0; i <= Count; i++)
{
if (carNumber == time[i])
{
//这里约定是 0 时进入的
cout << "车牌号是 " << carNumber << " 的车离开停车场,停留时间是:" << (leaveTime - arriveTime) <<
"小时,共花费了 " << parkingFee * (leaveTime - arriveTime) << " 元。" << endl;
to = false;
break;
}
}
if (to)
{
cout << "车牌号是 " << carNumber << " 的车离开停车场,停留时间是:" << (leaveTime - arriveTime) <<
"小时,共花费了 " << parkingFee * (leaveTime - arriveTime) << " 元。" << endl;
}
stopTime = leaveTime - arriveTime;//停车场上1车离开时间为下一车进入时间,所以为停留时间
//将临时栈里的车放进停车场
while (emptyStack(LS))
{
pop(LS, carNumber, arriveTime);
push(S, carNumber, arriveTime);
}
//如果便道上有车,开进停车场
if (emptyQueue(Q))
{
outQueue(Q, carNumber, arriveTime);
push(S, carNumber, stopTime);
}
}
}
cin >> state >> carNumber >> arriveTime;
}
}
//2.显示停车场基本信息
void parkInformation(int size, int fee)
{
cout << "\n 名称:停车场"
<< "\n 车位数:" << size
<< "\n 收费情况:" << fee << "元/时" << endl;
}
//3.查询当前停车场内车辆信息
void Show_parking(Stack S)
{
int i = S.top;
bool have = true;
if (i == -1) {
have = false;
cout << "\n停车场内无车辆存在!\n";
}
cout << "---------------------------------------------------------------------\n"
<< " 状态(A/D) | 车牌号 | 所在车位 | 进入时间 \n";
while ((i != -1) && have) {
cout << " A | " << S.carNumber[i] << " | " << (i + 1) << " | " << S.arriveTime[i] << endl;
i--;//逐个遍历
}
cout << "---------------------------------------------------------------------\n\n";
}
//4.查看便道车辆信息
void Show_Accessroad(Queue Q)
{
queue p = Q.front->next;//指定一个新的结点指向队头指针指向的结点
bool have = true;
int pos = 1;
if (p == NULL)
{
have = false;
cout << "\n便道内无车辆存在!\n";
}
cout << "-----------------------------------------------------\n"
<< " 车牌号 | 便道位置 | 进入时间 \n";
while ((p != NULL) && have)
{
cout << " " << p->carNumber << " | " << pos++ << " | " << p->arriveTime << endl;
p = p->next;//后移遍历
}
cout << "-----------------------------------------------------\n\n";
}
//6.停止停车场开放
void closeParking()
{
cout << "停车场内已无任何车辆......\n停车场已关闭!\n";
}
//停车场功能菜单
void display()
{
cout << "\n\n"
<< "*** 欢迎您进入停车场管理系统功能界面 ***\n\n"
<< "输入序号选择您需要的功能:\n\n"
<< "0.设置 停车场车位数和收费情况\n"
<< "1.车辆 进/出 停车场 2.显示停车场基本信息\n"
<< "3.查询当前停车场内车辆信息 4.查看便道车辆信息\n"
<< "5.清屏,保留菜单说明 6.停止停车场开放\n\n";
}
//若管理员选择,则调用函数即可
void Set_Carpart(int &parkingSize, int &parkingFee)
{
char ch;
cout << "请输入停车场最大容量:";
cin >> parkingSize;
cout << "请输入车在'停车场'每小时的费用(元/时):";
cin >> parkingFee;
}
//功能界面
void functionWindow()
{
//定义数据信息
int parkingSize = 0;//停车场容量 ,默认为 0
int parkingFee = 0;//停车场费用 ,默认为 0
int time[100];
//定义停车场、便道
Stack S, LS;//S指停车场,LS指临时栈
Queue Q;//队列(便道)
//初始情况下默认一切均为 0 (这个时候管理员还没有初始化)
initStack(S, parkingSize);
initStack(LS, parkingSize);
//初始化便道-------------> 因为 便道 使用链队列自动分配空间,不涉及大小,所以不影响 便道 初始化
initQueue(Q);
bool open = true;//开关
int choose;//选择
display();//调用"功能菜单"函数
while (true) {
cout << "\n请选择功能:\n";
cin >> choose;
switch (choose) {
case 0: {
Set_Carpart(parkingSize, parkingFee);//调用函数
//初始化停车场
//这个时候 管理员 进行了初始化,所以重新对停车场 赋值
initStack(S, parkingSize);
initStack(LS, parkingSize);
break;
}
case 1: {
load(S, LS, Q, parkingFee, time);
break;
}
case 2: {
parkInformation(parkingSize, parkingFee);
break;
}
case 3: {
Show_parking(S);
break;
}
case 4: {
Show_Accessroad(Q);
break;
}
case 5: {
system("cls");//清屏
display();//调用"功能菜单"函数
break;
}
}
if (choose == 6) {
closeParking();
break;
}
}
}
//管理员登陆
void manager() {
int managerName = 2022;//用户名
int password = 2022;//密码
bool open = false;//开关
int temp1, temp2;//两个临时存储信息的变量,用于比较
//验证账号
cout << "请输入账号:";
while (true) {
cin >> temp1;//存储到临时变量1中
if (temp1 == managerName) {
break;
}
else {
cout << "账号错误,请重新输入:";
}
}
//验证密码
cout << "请输入密码:";
while (true) {
cin >> temp2;//存储到临时变量2中
if (temp2 == password) {
open = true;//验证通过:登陆到管理界面
break;
}
else {
cout << "密码错误,请重新输入:";
}
}
if (open) {
functionWindow();//调用功能窗口函数
}
}
//主函数
int main() {
manager();//管理员登陆
}
###### 运行结果及报错内容
###### 我的解答思路和尝试过的方法
###### 我想要达到的结果
望采纳,代码和解释如下:
你可以在 inQueue 函数中增加一个参数,用来记录车辆的车牌号,然后在函数内部将该车牌号存储到队列的结点中。
例如,可以将 inQueue 函数的定义改为:
void inQueue(Queue &Q, int carNumber, int arriveTime, int carPlate)
{
queue p;
p = (queue)malloc(sizeof(qNode));//分配结点空间
if (!p) {
exit(-1);//内存分配失败,退出
}
p->carNumber = carNumber;
p->arriveTime = arriveTime;
p->carPlate = carPlate;//新增的存储车牌号的字段
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
然后,在需要查询某个车辆位置时,可以在队列中搜索该车辆的车牌号,并输出该车辆在停车场或便道的位置。
例如,你可以添加一个新的函数,用来查询指定车牌号的车辆位置:
void searchCar(Queue &Q, int carPlate)
{
queue p = Q.front;
while (p->next != NULL)
{
p = p->next;
if (p->carPlate == carPlate)
{
cout << "车牌号为 " << carPlate << " 的车辆位于 ";
if (p->position == 0)
{
cout << "便道上,位置为 " << p->carNumber;
}
else
{
cout << "停车场,位置为 " << p->position;
}
cout << endl;
return;
}
}
cout << "未找到车牌号为 " << carPlate << " 的车辆" << endl;
}
C/C++用栈和队列实现停车场问题
如有帮助,望采纳
https://blog.csdn.net/weixin_51406612/article/details/121085666