数据结构之栈和队列面试题(2)两个栈实现一个队列

我们怎么用两个栈来实现一个队列呢?
首先我们都知道,栈和队列的 出栈和出队列是不一样的,栈是后入先出,队列是先入先出。
所以我们的思路是,用两个栈,一个input,一个output,
这里写图片描述
我们每次想入栈的时候就先将output里面的元素依次出栈然后往input里面依次入栈,这个时候,input栈顶元素就是最后入栈的元素,我们可以在他后面进行入栈操作,也相当于入队列操作。
那么,我们每次想要出栈的时候,就把我们input栈里面的元素依次出栈,然后依次入栈到output里面,这个时候output里面最上面的元素就是最先入栈的元素,这个时候我们进行出栈操作,就相当于,队列的出队列操作

接下来就是具体的代码实现

#include<stdio.h>
#include"seqstack.h"
#include"seqstack.c"
typedef struct queuestack{
    seqstack input;
    seqstack output;
}queuestack;
初始化栈
void queuestack_init(queuestack *s)
{
    if(s == NULL)
    {
        return;
    }
    seqstack_init(s->input);
    seqstack_init(s->output);
}

打印函数

void queuestack_print(queuestack *s)
{
    if(s == NULL)
    {
        return;
    }
    size_t i = 0;
    for(;i < s->input.size;i++)
    {
        printf("[%c] ",s->input.data[i]);
    }
    printf("\n");
}

入队列函数

void queuestack_push(queuestack *s,seqstacktype value)
{
    if(s == NULL)
    {
        return;
    }
    if(s->output.size == 0)
    {
        seqstack_push(&s->input,value);
    }
    size_t i = 0;
    for(;i < s->output.size;i++)
    {
        seqstacktype top;
        seqstack_gettop(&s->output,&top);
        seqstack_pop(&s->output);
        seqstack_push(&s->input,top);
    }
    seqstack_push(&s->input,value);


}

出栈函数

void queuestack_pop(queuestack *s)
{
    if(s == NULL)
    {
        return;
    }
    seqstacktype top;
    size_t i =0;
    for(;i < s->input.size;i++)
    {
        seqstack_gettop(&s->input,&top);
        seqstack_pop(&s->input);
        seqstack_push(&s->output,top);
    }
    seqstack_pop(&s->output);
}

取栈顶元素

int queuestack_gettop(queuestack *s,seqstacktype *value)
{
    if(s == NULL || value == NULL)
    {
        return 0;
    }
    seqstacktype top;
    size_t i =0;
    for(;i < s->input.size;i++)
    {
        seqstack_gettop(&s->input,&top);
        seqstack_pop(&s->input);
        seqstack_push(&s->output,top);
    }
    return seqstack_gettop(&s->output,value);
}

下面是测试函数以及验证结果

这里写图片描述

这里写图片描述


如有错误,请指出,谢谢

猜你喜欢

转载自blog.csdn.net/mignatian/article/details/80204851