【发布时间】: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,1,1,1,2,1,2,1,2,1,2,1,2,1}
|___|
here is the problem
- 当我输入 2 退出队列时,队列已满,但没有任何内容被删除。输出是一些垃圾值
- 然后我输入 1 表示队列已满,但未显示队列已满;相反,它要求我输入一个数字。
(因为我先出队,所以我想先将一个元素入队,然后输入选项为 1。但它再次要求我输入一个数字。)
我无法找出错误。请原谅我的解释和奇怪的词汇。能否请您尝试代码并给出输入流以找出问题所在。
提前致谢。
【问题讨论】:
-
不是
queue->front = queue->front+1%queue->capacity;,您的意思是在queue->front+1周围加上括号吗? -
为了更容易测试,请将
display()函数更改为从head迭代到rear,而不是从0到capacity。 -
meowgoesthedog 谢谢。有效。 :)
-
SHG 因为它是一个循环队列,有时头部会大于尾部。而且我无法想出一个想法来显示元素而不是整个队列,因此我放置了 0 来暗示这个地方是空的。谢谢你的建议。 :)
-
我稍微改进了您的格式,但很难说出您的意思是问题出在哪里。我建议您缩进 {1,1,1...} 第 4 行空格,以便“这里是问题”括号显示问题的真正所在。
标签: c data-structures queue