2个栈实现1个队列

“.”与“->”的区别:https://blog.csdn.net/q496958148/article/details/80149634
栈的实现:https://blog.csdn.net/q496958148/article/details/80040641

这是一道很经典的面试题,也是我们必须要搞清楚的一个问题。

我们很清楚的知道栈和队列最根本的区别是:栈是先进后出,而队列是先进先出

那么问题就来了,如何用2个栈实现一个队列呢?
比方说现在要入队列4个元素:a b c d,那么我很明显出队列时必须是按照a b c d的顺序来出队列的。
分析如图:
这里写图片描述

通过上面的图,我们清晰了该如何实现一个队列的具体思路:
代码如下:
stack.c:

//引用以前的栈函数
#include "seqstack.h"

//创建一个包含俩个栈的结构体
typedef struct my_queue{
    seqstack input;//入队列的栈
    seqstack output;//出队列的栈
}my_queue;

//初始化
void queueInit(my_queue* root)
{
    if(root == NULL)
    {
        return;
    }
    seqstackInit(&root->input);
    seqstackInit(&root->output);
}

//入队列
void queuePush(my_queue* root,DataType value)
{
    if(root == NULL)
    {
        return;
    }

    //先检查出队列的栈中有没有元素,有的话记得要将出队列的元素全部移过来,才能入队列
    while(root->output.size != 0)//其中“.”与“->”的用法切记不要用错,开头有我的链接
    {
        DataType top = seqstackGetTop(&root->output);
        seqstackPush(&root->input,top);
        seqstackPop(&root->output);
    }
    seqstackPush(&root->input,value);
}

//出队列
void queuePop(my_queue* root)
{
    if(root == NULL)
    {
        return;
    }
    //和入队列一样,都得判断一下彼此的栈中是否有元素
    while(root->input.size != 0)
    {
        DataType top = seqstackGetTop(&root->input);
        seqstackPush(&root->output,top);
        seqstackPop(&root->input);
    }
    seqstackPop(&root->output);
}

//-------------------------------------------------------------
//--------测试代码
//-------------------------------------------------------------

//打印函数
void queueprint(my_queue* root)
{
    if(root == NULL)
    {
        return;
    }
    int i = root->input.size-1;
    printf("  入队列的栈:[");
    for(; i >= 0; i--)
    {
        printf("%c ",root->input.arr[i]);
    }

    printf(" ]\n");
    printf("  出队列的栈:[");
    for(i = root->output.size-1;i >= 0;i--)
    {
        printf("%c ",root->output.arr[i]);
    }
    printf(" ]\n");
}

void testqueue()
{
    LINE;
    my_queue root;
    queueInit(&root);

    printf("入队列4个元素:\n");
    queuePush(&root,'a');
    queueprint(&root);
    queuePush(&root,'b');
    queueprint(&root);
    queuePush(&root,'c');
    queueprint(&root);
    queuePush(&root,'d');
    queueprint(&root);

    printf("\n");

    printf("出对列4个元素:\n");
    queuePop(&root);
    queueprint(&root);
    queuePop(&root);
    queueprint(&root);
    queuePop(&root);
    queueprint(&root);
    queuePop(&root);
    queueprint(&root);

}

int main()
{
    testqueue();
    return 0;
}

效果图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值