弹出后使用数组>>移动元素的队列

时间:2012-02-03 13:59:35

标签: c++ data-structures

我尝试使用数组实现队列。这是我的代码:

#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 :(得分:0)

实施Circular Buffer以避免转移整个数据。

答案 1 :(得分:0)

您永远不会重置frontrear,它们会不断增加。

过度测试也是错误的:

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

你应该测试的是你是否要覆盖前面。我认为您只需保留front和元素数N即可获益。然后溢出和下溢变为N>SIZEN==0。然后在弹出和推动时增加和减少N。保持原样,但也保持模SIZE

另外,正如评论中所写。无需移动数据。