C++生长圆形阵列

Growing a circular array C++

本文关键字:阵列 长圆形 生长 C++      更新时间:2023-10-16

我正在尝试以数组的形式编写一个通用队列。 如果我将 arraySize 设置为特定值,一切似乎都可以工作,但是如果我每次填充数组时都尝试增大数组,则会导致值被覆盖。 我感谢任何关于我做错了什么的建议。 谢谢

页眉:

#ifndef QUEUE_ARRAY
#define QUEUE_ARRAY
template <typename E>
class Queue {
public:
    Queue();            //constructor
    //Queue(const Queue &obj);  //copy constructor note:the copy constructor is optional
    ~Queue();           //destructor
    void enqueue(const E& e);
    const E& dequeue(); //throw(QueueEmpty);  //note that the use of exceptions is optional
    const E& front() const; //throw(QueueEmpty); //note that the use of exceptions is optional
    int size() const;
    bool empty() const;
private:
    int frontElem, rear, numEntries, arraySize;
    E* queueArray;
};
#endif // 

质量保证计划:

#include "QueueArray.h"
#include <iostream>
template<typename E>
Queue<E>::Queue() {
    numEntries = 0;
    arraySize = 1;
    frontElem = 0;
    rear = 0;
    queueArray = new E[arraySize];
}
template<typename E>
Queue<E>::~Queue() {
    delete[] queueArray;
}
template<typename E>
void Queue<E>::enqueue(const E & e) {
    if (numEntries == arraySize) {
        arraySize = arraySize * 2;
        E* temp = new E[arraySize];
        for (int i = 0; i < numEntries; i++) {
            temp[i] = queueArray[(frontElem + i) % arraySize];
        }
        delete queueArray;
        queueArray = temp;
    }
    queueArray[rear] = e;
    rear = (rear + 1) % arraySize;
    numEntries++;
}
template<typename E>
const E& Queue<E>::dequeue() {
    E &temp = queueArray[frontElem];
    frontElem = ((frontElem + 1) % arraySize);
    numEntries--;
    return temp;
}
template<typename E>
const E& Queue<E>::front() const {
    return queueArray[frontElem];
}
template<typename E>
int Queue<E>::size() const {
    return numEntries;
}
template<typename E>
bool Queue<E>::empty() const {
    return (numEntries == 0);
}

质量保证扩展:

#include "QueueArray.cpp"
using namespace std;
template class Queue<int>;

质量保证测试:

#include "QueueArray.h"
#include <iostream>
using namespace std;
int main() {
    Queue<int> *s;
    s = new Queue<int>();
    for (int i = 1; i <= 25; i++){
        s->enqueue(i);
    }
    while (!s->empty()) {
        cout << "Dequeue: " << s->dequeue() << endl;
    }
    system("PAUSE");
    delete s;
}

当您将现有队列数据复制到 enqueue 中新分配的缓冲区时,将元素 frontElem 处的元素复制到元素 0。 您没有和需要的是复制数据后frontElem = 0;rear也需要更新。

delete queueArray应该是delete [] queueArray. 由于您要分配数组,因此需要删除数组。