0
点赞
收藏
分享

微信扫一扫

力扣232 用栈实现队列

胡桑_b06e 2022-04-04 阅读 72

题目连接: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;
}
举报

相关推荐

0 条评论