队列数据结构实现

时间:2017-11-17 14:57:35

标签: c arrays date queue structure

我目前正在尝试在C中实现队列数据结构。上下文如下:

医生手术需要一个计算机程序来为患者提供自助服务。患者使用此控制台在到达手术时检查。他们还可以使用控制台询问他们在等待名单中的位置,或者确定手术中目前有多少医生可以使用该程序。医生也会使用该程序检查(出院)患者是否已经完成检查。医生也使用该程序来检查和离开他们的房间。该程序必须保留所有已检查患者的等待名单(队列),并且只要其中一名医生是免费的,该程序必须呼叫下一名患者。通过显示消息来显示队列。

我需要实现以下队列函数:

void enqueue (int n) // append n to the queue
int dequeue () // remove the first item in the queue, and return its value
int first() // get the first item without removing it
int last () // get the last item without removing it
void clear () // clear (initialize) the queue
bool IsEmpty () // returns true if the queue is empty
bool IsFull () // returns true if the queue is full
void print () // print the entire queue
int position (int n) // returns the position of n in the queue, or -1 if n 
is not in the queue
void remove (int n) // remove n from the queue

位置函数是我努力的一点点:

int position(int n) {
  system("clear");
  int pos = 1;
  for (int i = front; i <= rear; i++) { // a for loop to run for each 
                                        // element in the queue
    if (queue[i % MAX] == n)  // checks to see whether the integer inputted 
                              // by the user is currently in the queue array    


  printf("Number %d is in the queue\n", num); //


  return;
    }
  }

我希望程序打印出队列中n的位置。我也不确定如何实现一个从队列中删除特定元素的函数。此外,我还没有尝试删除功能,所以当我已经尽力实现它时,我会再次发布。

感谢coderredoc,我得到了在队列中打印位置的代码!但是因为我希望它显示数字1,而不是0如果队列中的第一个,我使用了以下内容:

    void position(int n) {
      system("clear");
      int pos = 1;
      for (int i = front; i <= rear; i++) { 

        if (queue[i % MAX] == n)  
        printf("You are in the queue!\n"); 
        printf("Position in queue is %d \n",(i % MAX) +1);
            }
         }

但是它会在队列中的增量位置循环并打印多次。我知道这与我的for循环有关,但不知道如何防止它。

编辑:上面的功能现已修复。谢谢。

现在尝试实现一个函数来从队列中删除用户定义的元素。

1 个答案:

答案 0 :(得分:0)

代码中存在一些错误: -

<强> 1

int position(int n) {
  system("clear");
  int pos = 1;
  for (int i = front; i <= rear; i++) { // a for loop to run for each 
                                        // element in the queue
    if (queue[i % MAX] == n)  // checks to see whether the integer inputted 
                              // by the user is currently in the queue array    


  printf("Number %d is in the queue\n", num); //


  return 0; <----------PROBLEM
    }
  }

执行if后。元素不匹配。它会回来。

<强> 2

您也使用num,但在找到元素时不会更改。或至少你应该打印找到的元素。

第3

也在case 6:

scanf("%d, &id");应为scanf("%d", &id);

<强> 4

同样在position()功能中,您没有print正确的讯息。

printf("Number %d is in the queue\n", num);

printf("Number %d is in the queue\n", n);

<强> 5

您没有使用position()的返回值。如果您不需要返回任何内容,则应返回类型void

代码如何?

功能position()将是这样的

void position(int n) {
    system("clear");
    for (int i = front; i <= rear; i++) 
    { 

        if (queue[i % MAX] == n){
            printf("You are in the queue!\n"); 
            printf("Position in queue is %d \n",(i%MAX+1)-front);
            return;
        }  
    }
}

逻辑错误

  • 如果输入的数字超过5个,它会静默地删除元素而不发送任何消息。改变它。

  • 队列实施的逻辑 错误。删除所有5个元素后,它仍会显示消息queue已满且queue为空。

您申请的算法仍然是错误的。检查任何书籍。

为了帮助你,完整条件的队列

(rear+1)%MAX == front

队列为空条件为

front == -1 && rear == -1。 (这些适用于最初front= -1rear = -1的OP实施。

insert()的伪代码为:

1. if queue is full - show message.
2.    if queue is empty set front and rear to 0. [Denoting there is some element in queue]
3.    else rear = rear % MAX
4. put the element in the array at position rear.

delete()的伪代码为:

1. if queue is empty - show message.
2. else if front == rear then rear = front = -1
3. else front = (front + 1)%MAX.