为什么我在Array Queue程序中得到了不需要的输出?

时间:2017-10-01 21:55:43

标签: c++ arrays data-structures

该程序是我试图编程的基于阵列的队列 我得到的令人费解的输出是:

排队500 4199136 500

我无法弄清楚为什么 4199136 正在输出输出功能中的空格。

我知道这是我正在制作的某种内存/阵列管理问题,但我可以找到它的缺陷。任何见解都会非常感激。

代码完整地发布在下面。

#include <iostream>
#include <iomanip>
#include <array>
#define MAX_SIZE 10

using namespace std;

class ABQ
{
    private:
        int a[MAX_SIZE];
        int count, front, back;
    public:

    ABQ()
    {
            front = -1;
            back  = -1;
            count = 0;
    }

    bool IsEmpty()
    {
        return(front == -1 && back == -1);
    }

    bool IsFull()
    {
        return (back + 1) % MAX_SIZE == front ? true : false;
    }

    void Enqueue(int n)
    {
        cout << "Enqueuing " << n << endl;

        if(IsFull())
        {
            cout << "Array Based Queue is FULL" << endl;
            return;
        }

        else
        {
            back = (back + 1) % MAX_SIZE;
        }

        a[back] = n;
    }

    void Dequeue()
    {
        if(IsEmpty())
        {
            cout << "Array Based Queue is EMPTY" << endl;
            return;
        }

        else if(front == back)
        {
            back = front = -1;
        }

        else
        {
            front = (front + 1) % MAX_SIZE;
        }
    }

    int Front()
    {
        if(front == -1)
        {
            {
                return -1;
            }
            return a[front];
        }

        return 0;

    }

    void Output()
    {
        count = (back + MAX_SIZE - front) % MAX_SIZE + 1;

        for(int i = 0; i < count; i++)
        {
            int index = (front + i) % MAX_SIZE;
            cout << a[index] << " ";
        }

        cout << endl << endl;
    }
};


int main()
{
       ABQ Q;
       Q.Enqueue(500);
       Q.Output();


       return 0;
}

2 个答案:

答案 0 :(得分:0)

部分原因是frontback的初始值超出了数组索引的范围,部分原因是您无法正确处理front

致电Enqueue(500)后,front仍为-1back0。当您致电Output时,会输出两个值,一个位于a[-1],即未定义的行为,另一个位于a[0]

您的Output函数(可能还有其他地方)不需要将a[front]的值视为数组的有效元素。

答案 1 :(得分:0)

问题似乎出现在count = (back + MAX_SIZE - front) % MAX_SIZE + 1;声明中。

请注意,在Q.Enqueue(500);之后,back = 0和front = -1的值。

因此count将被计算为(0 + 10 - (-1))%10 + 1 = 2.

现在您可以在第一次Enqueue之后了解计数错误。