所以我在 CLang 中使用两个队列创建一个堆栈 我得到了 enqueue dequeue 和 printQueue。 不幸的是,我的一个队列的出队无法正常工作,以下是我迄今为止所写的内容:
int isQueueEmpty(Queue * queue)
{
if(queue == NULL) return 1;
else if(queue->head == NULL) return 1;
else return 0;
}
//// Do not modify this ////
void enqueue(Queue ** queue, void * item)
{
if(*queue == NULL)
*queue = malloc(sizeof(Queue));
if((*queue)->head == NULL)
{
(*queue)->head = malloc(sizeof(Node));
(*queue)->head->data = item;
(*queue)->head->next = NULL;
(*queue)->tail = (*queue)->head;
}
else
{
Node * temp = malloc(sizeof(Node));
(*queue)->tail->next = temp;
temp->data = item;
temp->next = NULL;
(*queue)->tail = temp;
}
}
//// Do not modify this ////
void * dequeue(Queue * queue)
{
if(queue == NULL || queue->head == NULL) return NULL;
else
{
void * temp = queue->head->data;
Node * tempNode = queue->head;
queue->head = queue->head->next;
free(tempNode);
return temp;
}
}
void printQueue(Queue * queue)
{
if(queue!=NULL)
{
printf("Queue content: {");
Node * temp = queue->head;
for(;temp!=NULL;temp = temp->next)
{
printf("%d ", *(int*)(temp->data));
}
printf("}\n");
}
else
printf("Uninitailized Queue\n");
}
Queue *q=NULL;
Queue* qu=NULL;
void push(void * item) {
printf("reeter here\n");
while(!isQueueEmpty(q)){
enqueue(&qu, q->head);
printf("eleq: %d\n", *((int*)dequeue(q)));
}
enqueue(&q, item);
while(!isQueueEmpty(qu)){
enqueue(&q, qu->head);
dequeue(qu);
//printf("elequ: %d\n", *((int*)dequeue(qu)));
}
printf("q:\n");
printQueue(q);
printf("qu:\n");
printf("reached end\n");
printQueue(qu);
}
不幸的是,我的第二个队列的出队没有正确删除元素,导致 pop() 中的第二个循环执行并无限循环。 其次,存储在队列中的数据在对其进行排队和取消引用后,它作为地址返回,而不是我输入的内容:
reeter here
q:
Queue content: {1}
qu:
reached end
Uninitailized Queue
reeter here
eleq: 1
q:
Queue content: {21519347601}
qu:
reached end
Queue content: {}
reeter here
eleq: 2
eleq: -159836464
q:
Queue content: {3-1598364641519347601}
qu:
reached end
Queue content: {}
Queue content: {3-1598364641519347601}
3
-159836464
1519347601
reeter here
这是我从 shell 收到的结果。因此,我如何首先修复 Push() 函数,以便它实际上推送并存储所需的数据,以及如何在不使用修改出队的情况下正确使第二个队列出队。 谢谢你
代码一开始就没有正确地将项目排队。在
enqueue()
函数中的两个 push()
调用中,您传递的是 Node *
,而它应该作为 void *
正确地传递给您实际排队的项目。
以下代码更改应该有效:
void push(void * item) {
while(!isQueueEmpty(q)){
enqueue(&qu, q->head->data);
printf("eleq: %d\n", *((int*)dequeue(q)));
}
enqueue(&q, item);
while(!isQueueEmpty(qu)){
enqueue(&q, qu->head->data);
printf("elequ: %d\n", *((int*)dequeue(qu)));
}
printf("q:\n");
printQueue(q);
printf("qu:\n");
printf("reached end\n");
printQueue(qu);
}
由于您尚未分享
item
的声明是什么样的,因此我使用从 item
声明为 int *
的 main()
进行了测试,对 push()
的调用工作正常。在程序结束时从队列前面删除项目q
现在将模拟堆栈排序:
$./stackqtest.exe
q:
Queue content: {1 }
qu:
reached end
Uninitailized Queue
eleq: 1
elequ: 1
q:
Queue content: {2 1 }
qu:
reached end
Queue content: {}
eleq: 2
eleq: 1
elequ: 2
elequ: 1
q:
Queue content: {3 2 1 }
qu:
reached end
Queue content: {}
eleq: 3
eleq: 2
eleq: 1
elequ: 3
elequ: 2
elequ: 1
q:
Queue content: {4 3 2 1 }
qu:
reached end
Queue content: {}