c - 输入流的队列出队入队错误

标签 c data-structures queue

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

#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;
        }

    }
}

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

看截图

插入后

第二。同时删除和插入 enter image description here

第三。问题发生了 enter image description here

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

  1. 排队
  2. 出队
  3. 展示
  4. 退出
{1,1,1,1,2,1,2,1,2,1,2,1,2,1}

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

(因为我先出队所以我想先入队一个元素然后输入选择作为 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;
        }

    }
}

关于c - 输入流的队列出队入队错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45948932/

相关文章:

c - 如何从 C 中的字符串中删除最后几个字符

javascript - 如何计算数组中的重复值并存储在数组中

c - LabWindows:实现可以处理字符串元素的线程安全队列

无法复制 FFMpeg Prores 质量设置

在 C 中复制无符号字符

c - 是 a[i]=y++; a[i++]=y;未定义的行为或未在 C 语言中指定?

algorithm - 查找具有路径压缩而不按等级并集的集合

c++ - C/C++ 获取结构大小

java - 切割和堆叠阵列

java - java中使用单栈实现队列