我正在编写一个简单的队列程序,该程序运行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;
}
代码的哪一部分会产生此访问错误,我该如何解决?在最初的几次迭代中,它似乎运行良好,但随后在结尾处停止正确访问。
答案 0 :(得分:0)
enqueue
不能处理队列包装,扩展也不能正确处理已包装的队列(在数组的末尾有数据,中间有未使用的元素)。
删除前25个元素后,容量为64,元素[25..49]被占用data
数组。当您添加第15个新元素(65)时,其大小仅为39,因此队列存储不会扩展,并且您将写入分配空间的末尾。
enqueue
需要使用myBack
进行包装,而dequeue
是使用myFront
进行包装,并且需要更改扩展代码以处理包装后的队列。