接收不一致的访问冲突,处理队列

Receiving inconsistent access violation working with queues

本文关键字:处理 队列 访问冲突 不一致      更新时间:2023-10-16

我正在编写一个简单的队列程序,该程序运行 for 循环并向队列添加递增的值。在达到队列的容量后,它会创建一个临时队列,该队列等于新的动态协调队列,并使新队列的容量加倍。它从大小 8 开始,但在尝试 124 数组时成为访问冲突。

#include <iostream>
using namespace std;
class queue {
public:
queue();
void enqueue(int item);
void dequeue();
int front();
bool empty();
private:
int * data;
int myFront;
int myBack;
int size;
int capacity;
};
queue::queue() {
myFront = 0;
myBack = 0;
size = 0;
capacity = 8;
data = new int[capacity];
}
bool queue::empty() {
return (size == 0);
}
void queue::enqueue(int item) {
if (size == capacity - 1) {
int * temp = new int[capacity * 2];
for (int i = 0; i < size; i++) {
temp[i] = data[i];
}
delete[] data;
data = temp;
capacity = capacity * 2;
myFront = data[0];
//myBack = temp[capacity/2];
}
data[myBack] = item;
myBack++;
size++;
}
int queue::front() {
return data[myFront];
}
void queue::dequeue() {
myFront = (myFront + 1) % capacity;
size = size - 1;
}
int main() {
queue nq;
// enqueue numbers 0-49
for (int i = 0; i < 50; i++) {
nq.enqueue(i);
}
// dequeue 25 times. Show prints 0 1 2 ... 24
for (int i = 0; i < 25; i++) {
cout << nq.front() << " ";
nq.dequeue();
}
cout << endl;
cout << "Check point 1" << endl;
// enqueue numbers 50-124. Now the queue should be 
// 25 26 ... 124 from front to end
for (int i = 50; i < 125; i++) {
nq.enqueue(i);
}
// dequeue 100 times. should show 25 26 ... 124
for (int i = 0; i < 100; i++) {
cout << nq.front() << " ";
nq.dequeue();
}
cout << endl;
int temp1;
cin >> temp1;
}

代码的哪一部分创建了此访问错误,我该怎么做才能解决它?它在前几次迭代中运行似乎很好,但随后在结束时停止正确访问。

enqueue

不处理队列包装,扩展也不能正确处理已包装的队列(数组的末尾和开头有数据,中间有未使用的元素)。

删除前 25 个元素后,容量为 64,元素 [25..49] 在data数组中被占用。 当您添加第 15 个新元素 (65) 时,大小仅为 39,因此队列存储不会扩展,并且您写入超过分配空间的末尾。

enqueue需要用myBack进行包装,就像dequeuemyFront所做的那样,并且需要更改扩展代码以处理包装的队列。