c++ - 使用 struct 排队(出租车调度问题)
问题描述
我想编写从用户读取命令的程序,当d
输入出租车时,它会提示输入driver_id
并将出租车存储在队列中(队列最多可以有n辆出租车),当c
客户输入命令时,它会分配最早的出租车排队给客户。
我正在尝试使用 struct 成员函数来解决它,以便我们的代码看起来不错,但是虽然我已经初始化n=4
,但它只能存储2
出租车,并显示第三个条目的队列已满,这不应该发生。请检查我的方法。
程序运行如下:
PS C:\Users; if ($?) { g++struct_taxi};; if ($?) { .\struct_taxi}
enter command:d
enter driverid:122
enter command:d
enter driverid:124
enter command:d
enter driverid:126
Q is full
代码:
#include<iostream>
using namespace std;
const int n=4;
struct Queue{
int elements[n],nwaiting,front;
void initialize(){
nwaiting=0;
front=0;
}
bool insert(int v){
if(nwaiting>=n)
return false;
elements[(front+nwaiting)%n]=v;
nwaiting++;
return true;
}
bool remove(int &v){
if(nwaiting==0)
return false;
else{
v=elements[front];
front=(front+1)%n;
nwaiting--;
return true;
}
}
};
int main(){
Queue q;
q.initialize();
while(true){
cout<<"enter command:";
char c;cin>>c;
if(c=='d'){
cout<<"enter driverid:";
int driverid;cin>>driverid;
if(!q.insert(driverid)){
cout<<"Q is full\n";}
else{
q.insert(driverid);
}
}
else if(c=='c'){
int driverid;
if(!q.remove(driverid)){
cout<<"No taxi available.\n";
}
else
//q.remove(driverid);
cout<<"assigning:"<<" "<<driverid<<endl;
}
}
}
解决方案
问题是当您检查条件时if(!q.insert(driverid))
,您已经将该驱动程序插入到系统中。然后else
语句再次插入它q.insert(driverid);
所以解决方案是简单地删除该else
语句。
#include<iostream>
using namespace std;
const int n=4;
struct Queue
{
int elements[n],nwaiting,front;
void initialize()
{
nwaiting=0;
front=0;
}
bool insert(int v)
{
if(nwaiting>=n) {return false;}
elements[(front+nwaiting)%n]=v;
nwaiting++;
return true;
}
bool remove(int &v)
{
if(nwaiting==0)
return false;
else
{
v=elements[front];
front=(front+1)%n;
nwaiting--;
return true;
}
}
};
int main()
{
Queue q;
q.initialize();
while(true)
{
cout<<"enter command:";
char c;
cin>>c;
if(c=='d')
{
cout<<"enter driverid:";
int driverid;
cin>>driverid;
if(!q.insert(driverid))
{
cout<<"Q is full\n";
}
}
else if(c=='c')
{
int driverid;
if(!q.remove(driverid))
{
cout<<"No taxi available.\n";
}
else {cout<<"assigning:"<<" "<<driverid<<endl;}
}
}
}
结果:
enter command:d
enter driverid:121
enter command:d
enter driverid:122
enter command:d
enter driverid:123
enter command:d
enter driverid:124
enter command:d
enter driverid:125
Q is full
显然,更简单的方法是使用std::queue
,一种用于这种情况的数据结构,并且由于它具有与Queue
结构相同的功能,因此代码会短得多:
#include <iostream>
#include <queue>
using namespace std;
const int maxn=2;
int main()
{ queue<int> q;
while(true)
{
cout << "Enter command : "; char c; cin >> c;
if (c == 'd') //if inserting new driver
{
cout << "Enter driver's ID : "; int id; cin >> id; //input id
if (q.size() == maxn) {cout << "Queue is full\n";} //if size of queue is equal to maxn, no insert
else {q.push(id);} //else insert
}
else if (c == 'c')
{
if (q.empty()) {cout << "No driver available\n";} //if no driver, no assigning
else
{
int curDriver = q.front(); //take drive in front of queue
q.pop(); //take the driver id out of queue
cout << "Assigned driver : " << curDriver << "\n";
}
}
}
}
结果:
Enter command : d
Enter driver's ID : 123
Enter command : d
Enter driver's ID : 124
Enter command : d
Enter driver's ID : 125
Queue is full
Enter command : c
Assigned driver : 123
Enter command : c
Assigned driver : 124
Enter command : c
No driver available
Enter command :
此外,不建议使用 , 等关键字front
作为remove
变量名。并查看为什么“使用命名空间标准;” 被认为是不好的做法?
推荐阅读
- artifactory - 在部分回购中进行人工存档搜索?
- c# - Autoincrement Int Id 未插入相关项目
- r - 如何从字符串中提取随机字符?
- r - 在 Shiny 中链接两个 dataTable 输出
- pine-script - 检查最后 x 笔交易是否亏损
- c++ - Qt No such slot 使用跳转表
- android - [Kotlin][RecyclerView] 错误未连接适配器
- c# - 强类型数据集表上 Linq JOIN 的无效转换异常
- javascript - 如何以一些好的方式将长 svg 代码添加到 html
- opengl - Opengl Multi-GPU:MULTICAST_GPUS_NV 在多 GPU 设置中始终返回 1