接收到不一致的访问冲突并使用队列

时间:2019-03-22 02:10:25

标签: c++ dynamic queue

我正在编写一个简单的队列程序,该程序运行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;
}

代码的哪一部分会产生此访问错误,我该如何解决?在最初的几次迭代中,它似乎运行良好,但随后在结尾处停止正确访问。

1 个答案:

答案 0 :(得分:0)

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

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

enqueue需要使用myBack进行包装,而dequeue是使用myFront进行包装,并且需要更改扩展代码以处理包装后的队列。