簡體   English   中英

為什么在Array Queue程序中得到不期望的輸出?

[英]Why am I getting an undesired output in my Array Queue program?

該程序是我嘗試編程的基於數組的隊列。
我得到的令人困惑的輸出是:

入隊500
4199136 500

我無法弄清楚為什么在Output函數中的空格之后輸出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;
}

部分原因是您的frontback初始值超出了數組索引的范圍,部分原因是您未正確處理front

調用Enqueue(500)front仍為-1back仍為0 當您調用Output ,這將輸出兩個值,一個在a[-1] (未定義行為),另一個在a[0]

您的Output函數(可能還有其他地方)無需將a[front]處的值視為數組的有效元素。

問題似乎出在count = (back + MAX_SIZE - front) % MAX_SIZE + 1; 聲明。

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

因此, count將計算為(0 + 10-(-1))%10 +1 = 2。

現在,你可以理解,計數是第一錯后Enqueue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM