#c
#c
Вопрос:
Предполагается, что код выполняет функции очереди, которые я правильно понял.
Единственная проблема, с которой я сталкиваюсь, заключается в том, что я должен удвоить размер массива до удвоенного его первоначального размера, как только массив будет полностью заполнен.
Я закодировал для этого, но все еще получаю значения мусора, когда пытаюсь ввести больше значений, чем исходный размер массива. Итак, проблема, похоже, в приведенной ниже функции inc ():
#ifndef Q_H_
#define Q_H_
#include <iostream>
using namespace std;
template <class elemType>
class arrayQueue
{
int size;
int *array;
int front;
int back;
int count;
public:
arrayQueue(elemType size)
{
this->size = size;
array = new int[size];
front = 0;
back = -1;
count=0;
}
bool isEmpty()
{
return (max()==0);
}
bool isFull() {
return (max()==size);
}
void enqueue(elemType entry)
{
cout << "enqueue " << entry;
if(isEmpty())
{
front = back = 0;
array[back] = entry;
count ;
}
else
{
back = (back 1) % size;
array[back] = entry;
count ;
}
cout << endl;
}
int maxsize()
{
return count;
}
void dequeue() {
cout << "dequeue : " << Front();
if(isEmpty())
{
cout << " error : empty";
}
else if(back == front)
{
back = front = -1;
}
else
{
front = (front 1) % size;
count--;
}
cout << endl;
}
void print()
{
if(isEmpty())
{
cout << "Queue is empty";
}
else
{
for(int i = front; i<count; i )
{
cout << array[i] << " ";
}
cout << array[back];
}
//cout<<"count is:" <<count<<endl;
cout << endl;
}
int Front()
{
if(front == -1)
{
cout<<"Queue is emptyn";
return -1;
}
return array[front];
}
int Back()
{
if(back==-1)
{
cout<<"Queue is full";
}
return array[back];
}
int max()
{
return count;
cout <<"count: " <<count;
}
void inc()
{
int newsize = this->size*2;
elemType *temp = new elemType[newsize];
for (int i=0; i<this->count;i )
{
temp[i]=this->array[(front i) % size];
}
delete [] this->array;
this->array=temp;
this->count=newsize;
// front=array[front]; //0
//front = 0;
//back=count;
}
};
#endif /* Q_H_ */
Я был бы действительно признателен за помощь в этом.
Комментарии:
1. В
inc
вы не обновляетеthis->size
Ответ №1:
три небольших изменения:
-
метод постановки в очередь: вставляется при заполнении
if (isFull()) { inc(); }
-
метод печати: распечатайте каждый элемент спереди назад
-
метод inc: скопируйте каждый элемент спереди назад и сбросьте передний и задний индексы
void inc() { int newsize = this->size*2; elemType *temp = new elemType[newsize]; // ******* IMPORTANT ****** // copy count elements for (int i = 0; i < count; i) { int index = (front i) % size; temp[i] = array[index]; } front = 0; back = count - 1; delete []array; array=temp; count=newsize; }
template <class elemType>
class arrayQueue
{
int size;
int *array;
int front;
int back;
int count;
public:
arrayQueue(elemType size)
{
this->size = size;
array = new int[size];
front = 0;
back = -1;
count=0;
}
bool isEmpty()
{
return (max()==0);
}
bool isFull() {
return (max()==size);
}
void enqueue(elemType entry)
{
cout << "enqueue " << entry;
if(isEmpty())
{
front = back = 0;
array[back] = entry;
count ;
}
else
{
if (isFull()) {
inc();
}
back = (back 1) % size;
array[back] = entry;
count ;
}
cout << endl;
}
int maxsize()
{
return count;
}
void dequeue() {
cout << "dequeue : " << Front();
if(isEmpty())
{
cout << " error : empty";
}
else if(back == front)
{
back = front = -1;
}
else
{
front = (front 1) % size;
count--;
}
cout << endl;
}
void print()
{
if(isEmpty())
{
cout << "Queue is empty";
}
else
{
// ******* IMPORTANT ******
for (int i = 0; i < count; i) {
int index = (front i) % size;
cout << array[index] << " ";
}
}
//cout<<"count is:" <<count<<endl;
cout << endl;
}
int Front()
{
if(front == -1)
{
cout<<"Queue is emptyn";
return -1;
}
return array[front];
}
int Back()
{
if(back==-1)
{
cout<<"Queue is full";
}
return array[back];
}
int max()
{
return count;
cout <<"count: " <<count;
}
void inc()
{
int newsize = this->size*2;
elemType *temp = new elemType[newsize];
// ******* IMPORTANT ******
// copy count elements
for (int i = 0; i < count; i) {
int index = (front i) % size;
temp[i] = array[index];
}
front = 0;
back = count - 1;
delete []array;
array = temp;
count = newsize;
}
};
Ответ №2:
Поскольку вы перемещаете элементы в начало вновь выделенного массива, inc
необходимо обновить front
и back
ссылаться на их соответствующие новые позиции.
Кроме того, вы обновляете, count
чтобы иметь новый размер вместо size
.
Комментарии:
1. На что в этом случае следует ссылаться back?