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

思路:
设栈1的栈顶=队尾;
栈2 的栈顶 = 队头;
入队:数据放在栈1
出队:检测栈2 是否有数据 有:出栈 没有:将栈1 的数据导入栈2出栈
取队头:取栈2的栈顶 检测栈2 是否有数据 有:返回栈顶元素 没有:将栈1 的数据导入栈2出栈
取队尾:取栈1的栈顶 检测栈1 是否有数据 有:返回栈顶元素 没有:将栈2 的数据导入栈1出栈
队列中元素的个数:栈1 中元素个数 +栈2 中元素个数
代码:

typedef struct Stack
{
    int top;
    DataType stack[max];
}Stack;
typedef struct QueueBy2Stack
{
    Stack s1;
    Stack s2;
}QueueBy2Stack;
void QueueBy2StackInit(QueueBy2Stack* Qlist);//初始化
void QueueBy2StackPush(QueueBy2Stack* Qlist, QDataType data);//入队
void QueueBy2StackPop(QueueBy2Stack* Qlist);//出队
QDataType QueueBy2StackFront(QueueBy2Stack* Qlist);//取队头
QDataType QueueBy2StackBack(QueueBy2Stack* Qlist);//取队尾
int QueueBy2StackSize(QueueBy2Stack* Qlist);//队大小
int QueueBy2StackEmpty(QueueBy2Stack* Qlist);//是否为空
void QueueBy2StackInit(QueueBy2Stack* Qlist)
{
    assert(Qlist);
    StackInit(&Qlist->s1);
    StackInit(&Qlist->s2);
}
void QueueBy2StackPush(QueueBy2Stack* Qlist, QDataType data)
{
    assert(Qlist);
    if (0 == StackNum(&Qlist->s2))
        StackPush(&Qlist->s1,data);
    else
        StackPush(&Qlist->s2,data);
}
void QueueBy2StackPop(QueueBy2Stack* Qlist)
{
    assert(Qlist);
    if (0 == StackNum(&Qlist->s1))
    {
        while (StackNum(&Qlist->s2) > 1)
        {
            StackPush(&Qlist->s1, StackTop(&Qlist->s2));
            StackPop(&Qlist->s2);
        }
        StackPop(&Qlist->s2);
    }
    else
    {
        while (StackNum(&Qlist->s1) > 1)
        {
            StackPush(&Qlist->s2, StackTop(&Qlist->s1));
            StackPop(&Qlist->s1);
        }
        StackPop(&Qlist->s1);
    }
}
QDataType QueueBy2StackFront(QueueBy2Stack* Qlist)
{
    assert(Qlist);
    if (0 == StackNum(&Qlist->s2))
    {
        while (StackNum(&Qlist->s1))
        {
            StackPush(&Qlist->s2, StackTop(&Qlist->s1));
            StackPop(&Qlist->s1);
        }
        return StackTop(&Qlist->s2);
    }
    else
    {
        return StackTop(&Qlist->s2);
    }
}
QDataType QueueBy2StackBack(QueueBy2Stack* Qlist)
{
    assert(Qlist);
    if (0 == StackNum(&Qlist->s1))
    {
        while (StackNum(&Qlist->s2))
        {
            StackPush(&Qlist->s1, StackTop(&Qlist->s2));
            StackPop(&Qlist->s2);
        }
        return StackTop(&Qlist->s1);
    }
    else
        return StackTop(&Qlist->s1);

}
int QueueBy2StackSize(QueueBy2Stack* Qlist)
{
    assert(Qlist);
    return StackNum(&Qlist->s1) + StackNum(&Qlist->s2);
}
int QueueBy2StackEmpty(QueueBy2Stack* Qlist)
{
    assert(Qlist);
    return !(StackNum(&Qlist->s1) + StackNum(&Qlist->s2));
}

上面代码,有些栈的基本操作没有给出,可以自己补充完整,也可以去后几篇中的栈的基本操作中找。

猜你喜欢

转载自blog.csdn.net/qq_39032310/article/details/81949774
今日推荐