栈和队列面试题 ---- 使用两个队列实现一个栈

思路:
压栈:检测那个队列有数据 —->放数据到该队列
出栈:检测哪个队列中有数据—–>将该队列中n-1个数据导入另一个队列,对这个栈第n-1个元素出栈
取栈顶:检测哪个队列中有数据—–>将该队列中n-1个数据导入另一个队列,将这个栈第n-1个元素返回,并将第n-1个元素压入另一个队列
代码:

typedef struct Queue
{
    QLinkList* front;
    QLinkList* rear;
    int sz;
}Queue;
typedef struct StackBy2Queue
{
    Queue q1;
    Queue q2;
}StackBy2Queue;
void StackBy2QueueInit(StackBy2Queue* p);//初始化
void StackBy2QueuePush(StackBy2Queue* p, DataType data);//入栈
void StackBy2QueuePop(StackBy2Queue* p);//出栈
DataType StackBy2QueueTop(StackBy2Queue* p);//取栈顶元素
int StackBy2QueueSize(StackBy2Queue* Qlist);//栈大小
int StackBy2QueueEmpty(StackBy2Queue* Qlist);//是否为空

void StackBy2QueueInit(StackBy2Queue* s)
{
    assert(s);
    QueueInit(&s->q1);
    QueueInit(&s->q2);

}

void StackBy2QueuePush(StackBy2Queue* s, DataType data)
{
    assert(s);
    if (QueueSize(&s->q2))
        QueuePush(&s->q2, data);
    else
        QueuePush(&s->q1, data);
}
void StackBy2QueuePop(StackBy2Queue* s)
{
    assert(s);
    if (QueueSize(&s->q1))
    {
        while (QueueSize(&s->q1) > 1)
        {
            QueuePush(&s->q2, QueueFront(&s->q1));
            QueuePop(&s->q1);
        }
        QueuePop(&s->q1);
    }
    else
    {
        while (QueueSize(&s->q2) > 1)
        {
            QueuePush(&s->q1, QueueFront(&s->q2));
            QueuePop(&s->q2);
        }
        QueuePop(&s->q2);
    }
}
DataType StackBy2QueueTop(StackBy2Queue* s)
{
    assert(s);
    if (QueueSize(&s->q1))
    {
        return QueueBack(&s->q1);
    }
    else
    {
        return QueueBack(&s->q2);
    }
}
int StackBy2QueueSize(StackBy2Queue* s)
{
    assert(s);
    return QueueSize(&s->q1) + QueueSize(&s->q2);
}
int StackBy2QueueEmpty(StackBy2Queue* s)
{
    assert(s);
    return QueueEmpty(&s->q1) && QueueEmpty(&s->q2);
}
void test3()
{
    int a = 0;
    StackBy2Queue Stack;
    StackBy2QueueInit(&Stack);
    StackBy2QueuePush(&Stack, 1);
    StackBy2QueuePush(&Stack, 2);
    StackBy2QueuePush(&Stack, 3);
    StackBy2QueuePush(&Stack, 4);
    DataType b = StackBy2QueueTop(&Stack);
    StackBy2QueuePop(&Stack);
    b = StackBy2QueueTop(&Stack);
    a = StackBy2QueueSize(&Stack);
    a = StackBy2QueueEmpty(&Stack);
    StackBy2QueuePop(&Stack);
    StackBy2QueuePop(&Stack);
    StackBy2QueuePop(&Stack);
    StackBy2QueuePop(&Stack);
    b = StackBy2QueueTop(&Stack);
    a = StackBy2QueueSize(&Stack);
    a = StackBy2QueueEmpty(&Stack);
}

上面代码有的队列基本函数没有给出,可以自己补充调用。

猜你喜欢

转载自blog.csdn.net/qq_39032310/article/details/81949879