从队列中删除数据

时间:2018-07-03 01:24:11

标签: c++ stack queue

我需要在C ++中使用队列的帮助。

我有一个iframe,其中包含2个成员,以后我想删除它们:

struct

这是我的出队代码:

#define MAX 10

struct queue{
    int head,tail;
    string code[max], title[max];
} q;

比方说,我已经在队列中输入了3个项目:

  1. if01 | c ++

  2. if02 |红宝石

  3. if03 | java

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

所以它最终应该像这样:

  1. if02 |红宝石

  2. if03 | java

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

  1. if02 | c ++

  2. if03 |红宝石

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

  1. if03 | c ++

我不知道为什么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(); } 不会像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会正常删除。

1 个答案:

答案 0 :(得分:0)

您的循环并没有同时绕过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();
}

我建议您采用另一种实现方式-将codetitle成员移至与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();
}