力扣232 用栈实现队列

题目连接:232. 用栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)

思路都在代码注释当中。

该题中栈是用数组表示的 没有指针概念 为了方便理解所以把指向数组下标位置的标志称为了指针。

typedef struct {
    // 用俩个栈模拟队列 栈用数组表示
    int stackIn[100],stackOut[100];
    // 栈是后进后出,只在栈尾进行操作,所以每个栈只需要一个指针(指向栈尾)
    int stackInTop,stackOutTop;
} MyQueue;


MyQueue* myQueueCreate() {
    // 初始化栈
    // 即 分配空间 设置好指向栈尾的指针(因为用数组表示栈 所以用下标代替指针)
    MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));
    queue->stackInTop = 0;
    queue->stackOutTop = 0;
    return queue;
}

void myQueuePush(MyQueue* obj, int x) {
    // 向栈中压入元素
    // 向栈尾结点添加元素,栈尾指针后移;
    // 注意栈尾指针是指向栈尾元素的下一位的,所以当需要读取的时候,是要先让栈尾指针 -1 再读取对应内容的
    obj->stackIn[(obj->stackInTop)++] = x;
}

int myQueuePop(MyQueue* obj) {
    // 用双栈模拟队列操作的核心
    // 一个是输入栈 一个是输出栈
    // 输入栈正常压入(相当于队列正常压入),当需要读取时,因为栈是后进后出,所以要借助输出栈模拟队列的先进先出
    // 把第一个栈中的所有元素 全部压入输出栈中
    // 经过这一步操作,原本输入栈中的元素顺序在输出栈中就反转过来了
    // 输出栈依旧是后进后出 但是最后一个元素正是输入栈中的第一个元素
    // 从而实现了用栈模拟队列的操作
    int stackOutTop = obj->stackOutTop;
    int stackInTop = obj->stackInTop;
    // 将输入栈中的元素全部写入输出栈中
    if(stackOutTop == 0) {
        while(stackInTop>0) {
            obj->stackOut[stackOutTop++] = obj->stackIn[--stackInTop];
        }
    }
    // 取出队列头元素
    int top = obj->stackOut[--stackOutTop];
    // 经过上一步的取出操作 此时栈尾指针指向的栈中最后一个元素的位置
    // 当再次使用栈操作输出元素的时候 是先 -1 再读取,所以就相当于没有了最后一个元素(上一步被取出的元素)
    // 把输入栈的元素再全部写回输入栈(相当于删除掉了队列的开头元素)
    while(stackOutTop > 0) {
        obj->stackIn[stackInTop++] = obj->stackOut[--stackOutTop];
    }
    // 因为该函数开头把输入栈输出栈的指针单独定义了出来 并且之后的操作都是在使用这俩个定义出来的指针
    // 所以当完成操作之后 把已经改变过后的指针(元素位置序号)重新定义回去
    obj->stackInTop = stackInTop;
    obj->stackOutTop = stackOutTop;
    return top;
}

int myQueuePeek(MyQueue* obj) {
    return obj->stackIn[0];
}

bool myQueueEmpty(MyQueue* obj) {
    return obj->stackInTop == 0 && obj->stackOutTop == 0;
}

void myQueueFree(MyQueue* obj) {
    obj->stackInTop=0;
    obj->stackOutTop=0;
}

你可能感兴趣的