c++ - 从队列中删除数据
问题描述
我需要帮助在 C++ 中使用队列。
我有一个struct
包含 2 个我想稍后删除的成员:
#define MAX 10
struct queue{
int head,tail;
string code[max], title[max];
} q;
这是我的出队代码:
void delete(){
if(empty()){
cout<<"Queue is empty!";
}else{
int i;
for (i = 0; i < q.tail; i++)
q.code[i]=q.code[1+i];
q.title[i]=q.title[i+1];
q.tail--;
}
show_data();
}
假设我在队列中输入了 3 个项目:
如果01 | C++
如果02 | 红宝石
如果03 | 爪哇
我想一个一个地删除项目。因为它是一个队列,所以应该删除的第一个数据是数字 1,对吗?
所以它最终应该是这样的:
如果02 | 红宝石
如果03 | 爪哇
但不幸的是,它不是那样工作的,我得到的输出是:
如果02 | C++
如果03 | 红宝石
然后,如果我再次尝试删除,我会得到如下输出:
- 如果03 | C++
我不知道为什么title
不会像code
.
如果我尝试反转循环,如下所示:
for (i = 0; i < q.tail; i++)
q.title[i]=q.title[i+1];
q.code[i]=q.code[1+i];
q.tail--;
code
不会删除,但会title
正常删除。
解决方案
您的循环不会围绕两者code
和title
成员一起移动。您只在循环内移动其中一个,然后在循环完成后将另一个移动大约1 次。
您需要在循环体中添加一些额外的大括号,例如:
void delete() {
if (empty()) {
cout << "Queue is empty!";
}
else {
for (int i = 0; i < q.tail; ++i) { // <-- add brace
q.code[i] = q.code[1+i];
q.title[i] = q.title[i+1]; // <-- do this INSIDE the loop!
} // <-- add brace
q.tail--;
}
show_data();
}
我建议另一种实现方式 - 将code
and成员移动到与分开title
的自己的位置,然后您可以将其实例作为一个单元移动,例如:struct
queue
struct
const int maxItems = 10;
struct data {
string code, title;
};
struct queue {
int head, tail;
data items[maxItems];
} q;
...
void delete() {
if (empty()) {
cout << "Queue is empty!";
}
else {
for (int i = 0; i < q.tail; ++i)
q.items[i] = q.items[1+i];
q.tail--;
}
show_data();
}
推荐阅读
- ace-editor - 如何在 Ace Editor 中自动滚动?
- node.js - 如何使用节点 js/Oauth 连接以交换 Web 服务
- excel - (10*1.11=11.1) 评估为 FALSE。如何纠正它
- security - 怎样才能找到PolicyGroup?
- java - 如何在 Android 中发出简单的 http post 请求?
- c# - 带有 URL c# 的 Web-Api 版本控制
- jspdf - jsPDF 错误 - vFS (VueJs) 中不存在字体
- amazon-web-services - 从 JSON 帐号数组构建 AWS IAM 策略
- apache-kafka-connect - Kafka连接运行速度非常慢并抛出间歇性错误
- angular - 在 [routerlink] 中传递一个枚举:Angular 7