这是我的程序,用于使用数组实现队列。第一次调用dequeue
时,我没有得到正确的输出,但是它显示了其余出队操作的正确输出(同样在显示了一些奇怪的值之后)。
该程序的输出如下:
136
14
13
1342222119
-1
-1
这是我尝试过的:
#include<stdio.h>
#include<stdlib.h>
struct queue {
int capacity;
int rear;
int front;
int *array;
};
struct queue* createqueue(int capacity)
{
struct queue* nque = (struct queue*)malloc(sizeof(struct queue));
nque->capacity = capacity;
nque->front = -1;
nque->rear = -1;
nque->array = (int*)malloc(sizeof(int)*capacity);
return nque;
}
int isempty(struct queue* amp)
{
return(amp->front == -1 && amp->rear == -1);
}
int isfull(struct queue* amp)
{
return (((amp->rear) + 1) % (amp->capacity) == amp->front);
}
void enqueue(struct queue* amp, int x)
{
if (isfull(amp))
return;
else if (isempty(amp))
{
amp->rear = 0;
amp->front = 0;
}
else
{
amp->rear = (amp->rear + 1) % (amp->capacity);
}
amp->array[amp->rear] = x;
}
int dequeue(struct queue* amp)
{
if (isempty(amp))
return -1;
else if (amp->front == amp->rear)
{
amp->front = -1;
amp->rear = -1;
return(amp->array[amp->front]);
}
else
{
amp->front = ((amp->front) + 1) % (amp->capacity);
return(amp->array[amp->front]);
}
}
int main() {
struct queue* queue = createqueue(10);
enqueue(queue, 12);
enqueue(queue, 136);
enqueue(queue, 14);
enqueue(queue, 13);
enqueue(queue, 16);
printf("\n%d", dequeue(queue));
printf("\n%d", dequeue(queue));
printf("\n%d", dequeue(queue));
printf("\n%d", dequeue(queue));
printf("\n%d", dequeue(queue));
printf("\n%d", dequeue(queue));
printf("\n%d", dequeue(queue));
}
如何解决此问题?
答案 0 :(得分:3)
您的dequeue
包含错误。
这是更正的版本:
int dequeue(struct queue* amp)
{
if (isempty(amp))
return -1;
else if (amp->front == amp->rear)
{
int value = amp->array[amp->front]; // get value before modifying front
amp->front = -1;
amp->rear = -1;
return value;
}
else
{
int value = amp->array[amp->front]; // get value before modifying front
amp->front = ((amp->front) + 1) % (amp->capacity);
return value;
}
}
或更优雅:
int dequeue(struct queue* amp)
{
int value;
if (isempty(amp))
return -1;
else
{
value = amp->array[amp->front];
if (amp->front == amp->rear)
{
amp->front = -1;
amp->rear = -1;
}
else
{
amp->front = ((amp->front) + 1) % (amp->capacity);
}
}
return value;
}
或更优雅:
int dequeue(struct queue* amp)
{
int value = -1;
if (!isempty(amp))
{
value = amp->array[amp->front];
if (amp->front == amp->rear)
{
amp->front = -1;
amp->rear = -1;
}
else
{
amp->front = ((amp->front) + 1) % (amp->capacity);
}
}
return value;
}
答案 1 :(得分:2)
让我们看看您的dequeue
函数中的这些行:
else if(amp->front==amp->rear)
{
amp->front=-1;
amp->rear=-1;
return(amp->array[amp->front]);
}
如果条件为true,则首先将值-1
分配给amp->front
。然后几行后,您使用amp->front
(还记得-1
吗?)作为数组的索引。
虽然可以使用负索引,因为所有数组索引实际上都是简单的指针算术,在这种情况下,它会导致索引超出范围,从而导致undefined behavior。
只需很少量的debugging your own code,就可以很容易地发现这一点,所以请下次再试一次。
关于如何解决此问题,您可能应该在“重置” amp->array[amp->front]
和front
成员之前,获取并保存rear
的值。然后返回保存的值。