【问题标题】:Logical Error in Circular Queue (Data Structures)循环队列中的逻辑错误(数据结构)
【发布时间】:2018-02-11 04:10:42
【问题描述】:

我试图运行它,无论我在队列中插入什么以及插入的数字数量是多少,它都不会显示循环队列。

这些是我想要澄清和/或更正的一些观点,希望得到回应。

  • 在下面的代码中,在函数Insert_in_Cqueue()的最后,有一个语句'rear++; Cqueue[后] = ele;' , rear++是不是表示我们是从后往前移动的,因为这就是我们插入循环队列的方式?

    • 在函数 Del_from_Cqueue() 的最后,有一个语句“front++”,这意味着通过增加“front”,我们只是失去了在特定运行中相关元素的跟踪函数del_from_cqueue(),本质上暗示我们已经删除了我们想要删除的元素?

代码:

#include<iostream>
#include<conio.h>
#include<process.h>
using namespace std;

int Insert_in_CQueue(int[], int);
void Display(int[], int, int);
int Del_from_CQueue(int CQueue[]);


void main()
{

const int size = 7;
int CQueue[size];
int Item, res, ch, front = -1, rear = -1;
do
{
    cout << "\t\t\t Circular Queue Menu\n";
    cout << "\t 1. Insert\n";
    cout << "\t 2. Delete\n";
    cout << "\t 3. Display\n";
    cout << "\t 4. Exit\n";
    cout << "\n Enter your choice(1-4)";
    cin >> ch;
    switch (ch)
    {
    case 1: cout << "\t\t You have selected the option to 'Insert' in the Queue. ";
        cout << "\n Enter item for insertion ";
        cin >> Item;
        res = Insert_in_CQueue(CQueue, Item);
        if (res == -1)
        {
            cout << "\n Overflow encountered";
        }
        else
        {
            cout << "\n Now the circular Queue is : ";
            Display(CQueue, front, rear);
        }
        break;
    case 2: Item = Del_from_CQueue(CQueue);
        cout << "\n Element deleted is : " << Item << endl;
        Display(CQueue, front, rear);
        break;

    case 3: Display(CQueue, front, rear);
        break;

    case 4: break;

    default: cout << "\n Valid choices are 1,2,3,4 only ";
        break;
    }

} while (ch != 4);
_getch();
return;

}

int Insert_in_CQueue(int CQueue[], int ele)
{
    int front = -1, rear = -1;
    const int size = 7;
    if ((front == 0 && rear == (size - 1)) || (front == rear + 1))     //the 
second condition, as it is a circular queue, no end
    {
        return -1;
    }
    else if (rear == -1)
    {
        front = rear = 0;
    }
    else if (rear == size - 1)
    {
        rear = 0;
    }
    else
        rear++;
    CQueue[rear] = ele;
    return 0;
}

void Display(int CQueue[], int front, int rear)
{
    int i = 0;
    const int size = 50;
    cout << "\n Circular Queue is : \n" << "(Front shown as >>>, Rear as <<< 
AND Free space as->\n";
    if (front == -1)
        return;
    if (rear >= front)
    {
        for (i = 0; i < front; i++) cout << "-";
        cout << ">>>";
        for (i = 0; i < rear; i++) cout << CQueue[i] << "<---";
        cout << CQueue[rear] << "<<<" << endl;

    }
    else
    {
        for (i = 0; i < rear; i++) cout << CQueue[i] << "<---";
        cout << CQueue[rear] << "<<<";
        for (i = 0; i < front; i++) cout << "-";
        cout << ">>>";
        for (i = front; i < size; i++) cout << CQueue[i] << "<---";

    }
}

int Del_from_CQueue(int CQueue[])
{
    int ret;
    int front = -1, rear = -1;
    const int size = 50;
    if (front == -1) return -1;
    else
    {
        ret = CQueue[front];
        if (front == rear)  front = rear = -1;
        else if (front == size - 1)
            front=0;    
        else front++;
    }
    return ret;
}

【问题讨论】:

    标签: c++11 data-structures


    【解决方案1】:
    1. 检查循环队列是否已满的标准方法是

      if((rear+1)%size == front)
          Queue is Full.
      
    2. 检查循环队列是否为空的标准方法是

       if(rear==front)
           Queue is Empty.
      

      记住:在循环队列中,当一个空间仍为空时,队列被认为已满。这样做是为了区分空和满的情况。

    3. 在插入或删除值时,您不能简单地增加 front 和 rear。前后端的值在达到队列大小时需要为零。 例如:队列大小为 7,当 front 或 rear 达到 6 的值时,它的下一个值应该是 0 而不是 7

    所以在插入时,您应该使用: rear=(rear+1)%size; CQueue[rear] = ele;

    在删除时,您应该使用: ret = CQueue[front]; front=(front+1)%size;

    你的答案: 是的 !当循环队列为空时,前后端都在一起。当我们在队列中插入元素时,后面增加而前面保持不变。插入的时候增加rear值,并不是说我们是从后面往前移动,而是当队列接近满的时候,前面和后面就凑到一起了。 例如:如果您从起点沿圆形路径奔跑,您首先会远离起点,但随着您倾向于完成跑步,您会从后面接近起点线。循环队列也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多