我目前正在尝试在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循环有关,但不知道如何防止它。
编辑:上面的功能现已修复。谢谢。
现在尝试实现一个函数来从队列中删除用户定义的元素。
答案 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= -1
和rear = -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.