在c中使用两个队列创建堆栈,出队不起作用

问题描述 投票:0回答:1

所以我在 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() 函数,以便它实际上推送并存储所需的数据,以及如何在不使用修改出队的情况下正确使第二个队列出队。 谢谢你

c segmentation-fault queue stack
1个回答
0
投票

代码一开始就没有正确地将项目排队。在

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: {}
© www.soinside.com 2019 - 2024. All rights reserved.