C++ - 无法从队列中删除元素

标签 c++ data-structures fifo

我试图删除队列的第一个元素,但这似乎不起作用。这是我的代码:

#include<iostream>
using namespace std;
int front = -1;
int rear = -1;
int i = 0;
const int size = 4;
int Q[size];

bool isEmpty(){
    return front == -1 && rear == -1;
}
bool isFull(){
    return rear == size - 1;
}
void Enqueue(int x){
    if(isFull()){
        cout << "The Queue is full." <<endl;
    }
    else if(isEmpty()){
        front++;
        rear++;
    }
    else{
        rear++;
    }
    Q[rear] = x;
}
void Dequeue(){
    if(isEmpty()){
        cout << "The Queue is empty." << endl;
    }
    else if(front == rear){
        front = -1;
        rear = -1;
    }
    else{
        front++;
    }
}
void display(){
    cout << "The Queue is: " << endl;
    for(i = 0; i <= rear; i++){
        cout << Q[i] << endl;   
    }
}

int main(){
    Enqueue(1);
    Enqueue(2);
    display();
    Dequeue();
    display();
    return 0;
}

这个 Dequeue() 函数应该移除 front 的元素,但它并没有这样做。这是我从上面的代码得到的输出:

The Queue is:
1
2
The Queue is:
1
2

代替:

The Queue is:
1
2
The Queue is:
2

我尝试了其他一些解决方案,但没有成功。我似乎无法理解它。非常感谢任何帮助!

最佳答案

您忘记在 display 中从 front 开始。它应该看起来像这样:

void display(){
    cout << "The Queue is: " << endl;
    for(int i = front; i <= rear; ++i) {
        cout << Q[i] << endl;   
    }
}

注意:当队列为空时,此函数将表现不佳(即产生未定义的行为)。您可以解决此问题,方法是从 int i = std::max(0, front); 开始,或者特殊情况下为空情况。

另一种方法是将 rear 指向最后一个元素之后的元素。 front, rear 范围对于 front == rear 来说是空的,范围内的元素数量就是 rear - front。这是 C++ 中的常见范例,请参见任何标准容器的 beginend,例如std::vector.

关于C++ - 无法从队列中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243881/

相关文章:

algorithm - 大 O 代表最坏情况运行时间,Ω 代表最好情况,但为什么有时 Ω 用于最坏情况?

c - FIFO 队列头指针不正确

c# - 将通用数据结构映射到特定数据结构的模式

c - 并发进程的 FIFO 问题

algorithm - 使用 LIFO 实现 FIFO

arrays - 移位 2D 数组 Verilog

c++ - 从该对象的方法或另一个类构造函数中删除该对象是否被认为是不好的做法?

c# - 如何将此方法从 C++ 转换为 C#?

c++ - 如何在 QCalendarWidget 中更改日期后保存条目?

c++ - 从字节数组中提取整数类型