gpt4 book ai didi

c - 在 C 中使用两个堆栈实现一个队列

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:35 24 4
gpt4 key购买 nike

为什么我的代码在运行时会崩溃。它说在 Push() 函数中传递不兼容的指针类型。如何解决这个问题?

这是我在 C 中实现的代码。这是我如何尝试解决问题的快速总结。

  • 首先我为 Stack 创建了一个结构
  • 为堆栈编写 Push 和 Pop 函数
  • 为队列编写了一个结构
  • EnQueue 的第一个堆栈和 DeQueue 操作的第二个堆栈。

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>

    struct Stack {
    int data;
    struct Stack *next;
    };


    struct Stack *CreateStack () {
    return NULL;
    }

    int isEmptyStack(struct Stack *top) {
    return (top == NULL);
    }

    void Push(struct Stack **top, int data) {
    struct Stack *newNode = (struct Stack*) malloc(sizeof(struct Stack));
    if(!newNode)
    return;
    newNode->data = data;
    newNode->next = *top;
    *top = newNode;
    }

    int Pop(struct Stack **top) {
    struct Stack *temp;
    int data;

    if(isEmptyStack(*top)) {
    printf("Empty Stack.\n");
    return INT_MIN;
    }

    temp = *top;
    data = (*top)->data;
    *top = (*top)->next;
    free(temp);
    return data;
    }

    struct Queue {
    struct Stack *S1;
    struct Stack *S2;
    };

    struct Queue *CreateQueue() {
    return NULL;
    }

    void EnQueue(struct Queue *Q, int data) {
    Push(Q->S1, data);
    }

    int DeQueue(struct Queue *Q) {
    if(!isEmptyStack(Q->S2)) {
    return Pop(Q->S2);
    }
    else {
    while(!isEmptyStack(Q->S1)) {
    Push(Q->S2, Pop(Q->S1));
    }
    return Pop(Q->S2);
    }
    }

    int main() {
    struct Queue *Q = CreateQueue();
    Q->S1 = Q->S2 = NULL;
    EnQueue(Q, 1);
    EnQueue(Q, 2);
    EnQueue(Q, 3);

    printf("%d ", DeQueue(Q));
    printf("%d ", DeQueue(Q));
    printf("%d ", DeQueue(Q));

    return 0;
    }

最佳答案

三个问题:

a) 调用 Push - 错误的参数类型:struct Stack **top 应该不是 struct Stack *top

b) 调用 Pop - 错误的参数类型:struct Stack **top 应该不是 struct Stack *top

c) 队列 *CreateQueue - 未分配内存

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

struct Stack {
int data;
struct Stack *next;
};


struct Stack *CreateStack () {
return NULL;
}

int isEmptyStack(struct Stack *top) {
return (top == NULL);
}

void Push(struct Stack **top, int data) {
struct Stack *newNode = (struct Stack*) malloc(sizeof(struct Stack));
if(!newNode)
return;
newNode->data = data;
newNode->next = *top;
*top = newNode;
}

int Pop(struct Stack **top) {
struct Stack *temp;
int data;

if(isEmptyStack(*top)) {
printf("Empty Stack.\n");
return INT_MIN;
}

temp = *top;
data = (*top)->data;
*top = (*top)->next;
free(temp);
return data;
}

struct Queue {
struct Stack *S1;
struct Stack *S2;
};

struct Queue *CreateQueue() {

struct Queue *newNode = (struct Queue *) malloc(sizeof(struct Queue ));

return newNode;
}

void EnQueue(struct Queue *Q, int data) {
Push(&Q->S1, data);
}

int DeQueue(struct Queue *Q) {
if(!isEmptyStack(Q->S2)) {
return Pop(&Q->S2);
}
else {
while(!isEmptyStack(Q->S1)) {
Push(&Q->S2, Pop(&Q->S1));
}
return Pop(&Q->S2);
}
}

int main() {
struct Queue *Q = CreateQueue();
Q->S1 = Q->S2 = NULL;
EnQueue(Q, 1);
EnQueue(Q, 2);
EnQueue(Q, 3);

printf("%d ", DeQueue(Q));
printf("%d ", DeQueue(Q));
printf("%d ", DeQueue(Q));

return 0;
}

输出:

1 2 3

关于c - 在 C 中使用两个堆栈实现一个队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45127513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com