基于队列数组的实现

时间:2018-08-15 13:09:49

标签: c data-structures

这是我的程序,用于使用数组实现队列。第一次调用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));
}

如何解决此问题?

2 个答案:

答案 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 的值。然后返回保存的值。