【发布时间】: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;whenrear == arraySizerear的输出值是多少?然后考虑如果当你填满数组并在下一个队列中调整大小时发生这种情况会发生什么。