首页 > 解决方案 > 从队列中删除数据

问题描述

我需要帮助在 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 个项目:

  1. 如果01 | C++

  2. 如果02 | 红宝石

  3. 如果03 | 爪哇

我想一个一个地删除项目。因为它是一个队列,所以应该删除的第一个数据是数字 1,对吗?

所以它最终应该是这样的:

  1. 如果02 | 红宝石

  2. 如果03 | 爪哇

但不幸的是,它不是那样工作的,我得到的输出是:

  1. 如果02 | C++

  2. 如果03 | 红宝石

然后,如果我再次尝试删除,我会得到如下输出:

  1. 如果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正常删除。

标签: c++stackqueue

解决方案


您的循环不会围绕两者codetitle成员一起移动。您只在循环内移动其中一个,然后在循环完成后将另一个移动大约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();
}

我建议另一种实现方式 - 将codeand成员移动到与分开title的自己的位置,然后您可以将其实例作为一个单元移动,例如:structqueuestruct

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

推荐阅读