【问题标题】:Reversing a queue using recursion and returning a new queue使用递归反转队列并返回新队列
【发布时间】:2020-06-27 21:30:21
【问题描述】:

我必须创建一个接收单个参数的函数,这是队列,并返回在函数中创建的新队列,我真的不知道该怎么做以及我做错了什么。

Queue * reverse(Queue * f) {
    Queue * n = (Queue*)malloc(sizeof(Queue));
    n = create_queue();
    if (empty_queue(f)) {
        return n;
    }else {
        int v = pop_queue(f);
        f = reverse(f);
        push_queue(n, v);
    }
}

如有疑问,我的队列是这样的:

typedef struct queue Queue;
typedef struct elemqueue ElemQueue;
struct elemfila {
    int info;
    ElemQueue* next;
};
struct fila {
    ElemQueue * start;
    ElemQueue * end;
};

我这样称呼它:

int main(void) {
    Queue * f;
    f = create_queue();
    push_queue(f, 2);
    push_queue(f, 4);
    push_queue(f, 6);

    f = reverse(f);

    while (!empty_queue(f)) {
        int n = pop_queue(f);
        printf(" %d ", n);
    }

    free_queue(f);
    return 0;
}

如图所示,我的队列是 [2|4|6](只是一个示例),我希望它转到 [6|4|2] 并打印出来。

【问题讨论】:

  • 这是一个不错的开始,但请进行编辑以显示您的调用代码,如果有任何输入,请将其包括在内,并明确说明您的预期输出或行为是什么。这将使它接近,它不会一直成为minimal reproducible example
  • 这就是我刚刚做的,谢谢!!

标签: c recursion queue reverse


【解决方案1】:

您无需创建新队列。如果队列为空,则返回给定的队列。

当您在递归调用之后重新推送元素时,您应该在逻辑上将其推送到返回的队列中。

如果您的队列不为空,则您的函数将无法返回任何内容。

如果我重写你的函数体,它看起来像:

    if (!empty_queue(f)) {
        int v = pop_queue(f);
        push_queue(reverse(f), v);
    }
    return f;

如果你坚持要创建一个新队列,我会在检测到空队列时创建。

    if (empty_queue(f)) {
        return create_queue();
    }
    int v = pop_queue(f);
    f = reverse(f);
    push_queue(f, v);
    return f;

在这个实现中,假设调用者拥有传入的队列,并负责销毁现在为空的旧队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多