【问题标题】:Queues dequeue enqueue error for input stream输入流的队列出队入队错误
【发布时间】:2018-02-07 11:46:01
【问题描述】:

我正在尝试使用队列的数据结构,这是一种循环队列。

#include <stdio.h>
#include <stdlib.h>

enum boolean{
   false,true
};

struct ArrayQueue{
    int rare,front;
    int capacity;
    int *array;
};

struct ArrayQueue* CreateQueue(int cap)
{
    struct ArrayQueue* queue;
    queue = (struct ArrayQueue*)malloc(sizeof(struct ArrayQueue));
    queue->rare = -1;
    queue->front = -1;
    queue->capacity = cap;
    queue->array = (int*)malloc(sizeof(int)*queue->capacity);
    int i;
    for (i=0;i<queue->capacity;i++)
        queue->array[i] = 0;
    return(queue);
}

enum boolean isFull(struct ArrayQueue *queue)
{
    return((queue->rare+1)%queue->capacity == queue->front);
}

enum boolean isEmpty(struct ArrayQueue *queue)
{
    return(queue->front == -1);
}

int ElementsInQueue(struct ArrayQueue *queue)
{
    return(((queue->capacity-queue->front)+queue->rare+1)%queue->capacity);
}

void En_queue(struct ArrayQueue *queue,int item)
{
    if (isFull(queue) == false)
    {
        queue->rare = (queue->rare+1)%queue->capacity;
        queue->array[queue->rare] = item;
        if (queue->front == -1)
            queue->front = queue->rare;
    }
}

int De_queue(struct ArrayQueue *queue)
{
    int data;
    if (isEmpty(queue) == false)
    {
        data = queue->array[queue->front];
        queue->array[queue->front] = 0;
        if (queue->front == queue->rare)
        {
            queue->front = -1;
            queue->rare = -1;
        }
        else
        {
            queue->front = queue->front+1%queue->capacity;
        }
        return data;
    }
}

void Display(struct ArrayQueue *queue)
{
    int i;
    printf("\n Displaying the queue : \n");
    for (i=0;i<queue->capacity;i++)
        printf("%d ",queue->array[i]);
}

int main(void)
{
    int cap,choice,item;
    struct ArrayQueue *queue;
    printf("\nEnter the Capacity of Queue: ");
    scanf("%d",&cap);
    queue = CreateQueue(cap);
    while(1)
    {
        printf("\n\n");
        printf("\n1.Enqueue");
        printf("\n2.Dequeue");
        printf("\n3.Display");
        printf("\n4.Exit");
        printf("\nEnter choice: ");
        scanf("%d",&choice);
        switch (choice)
        {
        case 1: if (isFull(queue) == true)
                {
                    printf("\nQueue is Full..");
                    break;
                }
                else
                {
                   printf("\nEnter a number: ");
                   scanf("%d",&item);
                   En_queue(queue,item);
                   Display(queue);
                }
                break;
        case 2: if (isEmpty(queue)== true)
                {
                    printf("\nQueue is Empty..");
                    break;
                }
                else
                {
                    item = De_queue(queue);
                    printf("\nItem popped is: %d",item);
                    Display(queue);
                }
                break;
        case 3: Display(queue);
                break;
        case 4: exit(0);
                break;
        }

    }
}

第一眼看起来很完美,但几乎没有问题。

查看截图

插入后

第二。同时删除和插入

第三。问题发生

我的输入流是(根据这个模式)...

  1. 入队
  2. 出队
  3. 显示
  4. 退出
{1,1,1,1,2,1,2,1,2,1,2,1,2,1}

                        |___|
                      here is the problem
  • 当我输入 2 退出队列时,队列已满,但没有任何内容被删除。输出是一些垃圾值
  • 然后我输入 1 表示队列已满,但未显示队列已满;相反,它要求我输入一个数字。

(因为我先出队,所以我想先将一个元素入队,然后输入选项为 1。但它再次要求我输入一个数字。)

我无法找出错误。请原谅我的解释和奇怪的词汇。能否请您尝试代码并给出输入流以找出问题所在。

提前致谢。

【问题讨论】:

  • 不是queue-&gt;front = queue-&gt;front+1%queue-&gt;capacity;,您的意思是在queue-&gt;front+1 周围加上括号吗?
  • 为了更容易测试,请将display() 函数更改为从head 迭代到rear,而不是从0capacity
  • meowgoesthedog 谢谢。有效。 :)
  • SHG 因为它是一个循环队列,有时头部会大于尾部。而且我无法想出一个想法来显示元素而不是整个队列,因此我放置了 0 来暗示这个地方是空的。谢谢你的建议。 :)
  • 我稍微改进了您的格式,但很难说出您的意思是问题出在哪里。我建议您缩进 {1,1,1...} 第 4 行空格,以便“这里是问题”括号显示问题的真正所在。

标签: c data-structures queue


【解决方案1】:

这是正确的答案。谢谢大家:)

#include <stdio.h>
#include <stdlib.h>

enum boolean{
   false,true
};

struct ArrayQueue{
    int rare,front;
    int capacity;
    int *array;
};

struct ArrayQueue* CreateQueue(int cap)
{
    struct ArrayQueue* queue;
    queue = (struct ArrayQueue*)malloc(sizeof(struct ArrayQueue));
    queue->rare = -1;
    queue->front = -1;
    queue->capacity = cap;
    queue->array = (int*)malloc(sizeof(int)*queue->capacity);
    int i;
    for (i=0;i<queue->capacity;i++)
        queue->array[i] = 0;
    return(queue);
}

enum boolean isFull(struct ArrayQueue *queue)
{
    return((queue->rare+1)%queue->capacity == queue->front);
}

enum boolean isEmpty(struct ArrayQueue *queue)
{
    return(queue->front == -1);
}

int ElementsInQueue(struct ArrayQueue *queue)
{
    return(((queue->capacity-queue->front)+queue->rare+1)%queue->capacity);
}

void En_queue(struct ArrayQueue *queue,int item)
{
    if (isFull(queue) == false)
    {
        queue->rare = (queue->rare+1)%queue->capacity;
        queue->array[queue->rare] = item;
        if (queue->front == -1)
            queue->front = queue->rare;
    }
}

int De_queue(struct ArrayQueue *queue)
{
    int data;
    if (isEmpty(queue) == false)
    {
        data = queue->array[queue->front];
        queue->array[queue->front] = 0;
        if (queue->front == queue->rare)
        {
            queue->front = -1;
            queue->rare = -1;
        }
        else
        {
            queue->front = (queue->front+1)%queue->capacity;
        }
        return data;
    }
}

void Display(struct ArrayQueue *queue)
{
    int i;
    printf("\n Displaying the queue : \n");
    for (i=0;i<queue->capacity;i++)
        printf("%d ",queue->array[i]);
}

int main(void)
{
    int cap,choice,item;
    struct ArrayQueue *queue;
    printf("\nEnter the Capacity of Queue: ");
    scanf("%d",&cap);
    queue = CreateQueue(cap);
    while(1)
    {
        printf("\n\n");
        printf("\n1.Enqueue");
        printf("\n2.Dequeue");
        printf("\n3.Display");
        printf("\n4.Exit");
        printf("\nEnter choice: ");
        scanf("%d",&choice);
        switch (choice)
        {
        case 1: if (isFull(queue) == true)
                {
                    printf("\nQueue is Full..");
                    break;
                }
                else
                {
                   printf("\nEnter a number: ");
                   scanf("%d",&item);
                   En_queue(queue,item);
                   Display(queue);
                }
                break;
        case 2: if (isEmpty(queue)== true)
                {
                    printf("\nQueue is Empty..");
                    break;
                }
                else
                {
                    item = De_queue(queue);
                    printf("\nItem popped is: %d",item);
                    Display(queue);
                }
                break;
        case 3: Display(queue);
                break;
        case 4: exit(0);
                break;
        }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多