栈实现队列方法与优化
更简洁的栈实现队列
对于算法面试,我们需要简洁高效的代码。以下是专门为面试准备的简化版本:
极简实现
#include <stdio.h>
#include <stdbool.h>#define MAX_SIZE 100typedef struct {int in[MAX_SIZE], out[MAX_SIZE];int in_top, out_top;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));obj->in_top = obj->out_top = -1;return obj;
}void myQueuePush(MyQueue* obj, int x) {obj->in[++obj->in_top] = x;
}int myQueuePop(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top--];
}int myQueuePeek(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top];
}bool myQueueEmpty(MyQueue* obj) {return obj->in_top == -1 && obj->out_top == -1;
}void myQueueFree(MyQueue* obj) {free(obj);
}
超简洁版本(一行注释都不带)
typedef struct {int in[100], out[100];int in_top, out_top;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj = malloc(sizeof(MyQueue));obj->in_top = obj->out_top = -1;return obj;
}void myQueuePush(MyQueue* obj, int x) {obj->in[++obj->in_top] = x;
}int myQueuePop(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top--];
}int myQueuePeek(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top];
}bool myQueueEmpty(MyQueue* obj) {return obj->in_top == -1 && obj->out_top == -1;
}void myQueueFree(MyQueue* obj) {free(obj);
}
面试时需要解释的关键点
- 核心思想:用两个栈,一个负责入队,一个负责出队
- 关键操作:当出队栈为空时,将入队栈的所有元素"倒"到出队栈
- 时间复杂度:
- Push: O(1)
- Pop/Peek: 摊还O(1)(每个元素最多被移动一次)
面试回答模板
面试官问:“请用栈实现队列”
你可以这样回答:
“我可以使用两个栈来实现队列。一个栈专门用于入队操作,另一个栈专门用于出队操作。当需要出队但出队栈为空时,我会将入队栈的所有元素转移到出队栈,这样出队栈的栈顶就是队列的头部元素。这种方法可以保证入队O(1)时间复杂度,出队和查看队首的摊还时间复杂度也是O(1)。”
完整测试代码(供练习用)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>// 在这里插入上面的极简实现代码int main() {MyQueue* q = myQueueCreate();// 测试用例myQueuePush(q, 1);myQueuePush(q, 2);printf("%d\n", myQueuePeek(q)); // 1printf("%d\n", myQueuePop(q)); // 1printf("%d\n", myQueueEmpty(q)); // 0 (false)myQueueFree(q);return 0;
}
这种简洁版本在面试中足够使用,重点是要理解算法原理并能清晰解释。记住核心思想:两个栈,一个进一个出,需要时倒腾一下。