【问题标题】:Growing a circular array C++增长一个圆形数组 C++
【发布时间】:2017-10-06 00:10:17
【问题描述】:

我正在尝试以数组的形式编写一个通用队列。如果我将 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 // 

质量保证 CPP:

#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>;

QA 测试:

#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;
}

【问题讨论】:

  • 当您使用调试器单步执行代码时,一次一行,并在重新分配期间检查队列的内容,您做了什么观察?
  • 将模板实现放在 cpp 文件中然后包含 cpp 文件通常是个坏主意。很多丑陋的结果。我强烈建议将模板实现保留在标题中。如果必须拆分类和实现,请将它们都放在标题中,并让定义标题包含实现标题。
  • Sam,它似乎正在为我设置 arraySize 的值重置我的后 int 值。但我不确定为什么会这样。
  • rear = (rear + 1) % arraySize; when rear == arraySize rear 的输出值是多少?然后考虑如果当你填满数组并在下一个队列中调整大小时发生这种情况会发生什么。

标签: c++ arrays queue


【解决方案1】:

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

delete queueArray 应该是delete [] queueArray。由于是分配数组,所以需要删除数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多