Очередь с использованием Array >> смещение элементов после выталкивания - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь реализовать очередь, используя массив.Вот мой код:

#include <iostream.h>
#define SIZE 5

class queue
{
    int *Queue, front, rear;

    public:
    queue() {
        Queue = new int[SIZE];
        front = rear = -1;
    }

    void push() {
        if (rear == (SIZE-1)) {
            cout<<"\n Overflow!";
        } else {
            rear++;
            cout<<"\n Enter element: ";
            cin>>Queue[rear];   
        }
    }

    void pop() {
        if (front == rear) {
            cout<<"\n Underflow!";
        } else {
            cout<<"\nElement popped: "<<Queue[++front];
        }
    }

    void display() {
        if (front == rear) {
            cout<<"\n Queue Empty";
        } else {
            for(int i = (front+1); i<=rear; i++) {
                cout<<Queue[i]<<" ";
            }
        }
    }
};


int main()
{
    int choice;
    queue q;
    while(choice != 4)
    {
        cout<<"\n\n Enter your choice :"
            <<"\n 1. Push an element into Queue."
            <<"\n 2. Pop an element from Queue."
            <<"\n 3. Display the Queue."
            <<"\n 4. Exit the program.\n\n";
        cin>>choice;

        switch (choice) {
            case 1:
                q.push();
                break;
            case 2:
                q.pop();
                break;
            case 3:
                q.display();
                break;
            case 4:
                break;
        }
    }

    return 0;
}

Дело в том, что как только переполнение встречается, даже после выталкивания элемента задняя часть остается прежней, и другой элемент не добавляется, когда есть свободное место, куда он может пойти.

Решением для этого может быть смещение каждого элемента на одно место вперед, чтобы в конце было пустое место, но у меня возникли проблемы со сдвигом.Кроме того, если я попытаюсь вставить после всплывающего сообщения 2-3 раза до достижения переполнения, это все равно дает переполнение, даже если в очереди только 3 элемента.Как я могу решить это?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Вы никогда не сбрасываете front или rear, они продолжают расти вечно.

тест переполнения также неверен:

if (rear == (SIZE-1)) {
        cout<<"\n Overflow!";

то, что вы должны тестировать, это если вы собираетесь перезаписать фронт. Я думаю, что вы выиграете от того, что просто сохраните front и количество элементов N. Тогда переполнение и потеря значения становятся N>SIZE и N==0 вместо этого. Затем просто увеличивайте и уменьшайте N, когда вы нажимаете и нажимаете. Держите фронт таким, какой он есть, но также держите его по модулю SIZE.

Также, как написано в комментарии. Нет необходимости перемещаться по данным.

0 голосов
/ 03 февраля 2012

Реализация циклического буфера , чтобы избежать необходимости сдвигать все данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...