我正在尝试使用队列的数据结构,这是一种循环队列 . 这是以下代码 .
#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;
}
}
}
乍一看看起来很完美,但问题很少 .
看截图
插入后
2nd. Deleting and inserting simultaneously 3rd. the problem occured
对不起,伙计们我真的很想解释一下 .
我的输入流是(根据这种模式)...
-
入队
-
出队
-
显示
-
退出
{} 1,1,1,1,2,1,2,1,2,1,2,1,2,1
|___|
here is the problem
-
当我输入2表示队列已满时,队列已满 . 但没有删除 . 输出是一些垃圾值
-
然后我输入1排队队列已满,但没有显示队列已满 . 相反,它让我输入一个数字 .
(因为我先出列了所以我想先将一个元素排入队列然后再输入选项1.但是它又要求我输入一个数字 . )
我无法弄清楚错误 . 原谅我的解释和奇怪的词汇 . 请尝试代码并输入输入流以找出问题 .
请指导我到底出了什么问题 . 提前致谢 .
1 回答
这是正确的答案 . 谢谢大家 :)