Реализация очереди и изменение размера массива с использованием C

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

три небольших изменения:

  1. метод постановки в очередь: вставляется при заполнении

     if (isFull())
    {
        inc();
    }
      
  2. метод печати: распечатайте каждый элемент спереди назад

  3. метод 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?