一【题目类别】
- 队列
二【题目难度】
- 简单
三【题目编号】
- 面试题03.04.化栈为队
四【题目描述】
- 实现一个MyQueue类,该类用两个栈来实现一个队列。
五【题目示例】
- 示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
六【解题思路】
- 很经典的一道题目,利用双栈去完成操作
- 因为栈是后进先出,而队列是先进先出,所以每次入队列的时候,将主栈中的元素都放到辅助栈,再将元素入主栈,最后再将辅助栈的元素入主栈。看起来很复杂,其实很好理解,脑子里想一下或者可以用笔和纸简单画一画就明白了
- 至于出队列、peek队列、队列判空等方法,直接根据主栈判断即可。辅助栈只在入队列的时候有帮助,其余函数并没用到
七【题目说明】
- 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size 和 is empty 操作是合法的。
- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
- 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 为元素个数
- 空间复杂度: O ( n ) O(n) O(n),其中 n n n 为元素个数
九【代码实现】
- Java语言版
package Queue;
import java.util.Stack;
public class I0304_ImplementQueueUsingStacksIcci {
Stack<Integer> stack;
Stack<Integer> temp;
public void MyQueue() {
stack = new Stack<>();
temp = new Stack<>();
}
public void push(int x) {
if (stack.isEmpty()) {
stack.push(x);
return;
}
while (!stack.isEmpty()) {
temp.push(stack.pop());
}
stack.push(x);
while (!temp.isEmpty()) {
stack.push(temp.pop());
}
}
public int pop() {
return stack.pop();
}
public int peek() {
return stack.peek();
}
public boolean empty() {
return stack.isEmpty();
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct
{
int data[1000];
int top;
} MyQueue;
MyQueue* myQueueCreate()
{
MyQueue* stack = (MyQueue*)malloc(sizeof(MyQueue));
stack->top = -1;
return stack;
}
void myQueuePush(MyQueue* obj, int x)
{
if (obj->top == -1)
{
obj->data[++obj->top] = x;
return;
}
MyQueue* temp = myQueueCreate();
while (obj->top >= 0)
{
temp->data[++temp->top] = obj->data[obj->top--];
}
obj->data[++obj->top] = x;
while (temp->top >= 0)
{
obj->data[++obj->top] = temp->data[temp->top--];
}
}
bool myQueueEmpty(MyQueue* obj)
{
return obj->top == -1;
}
int myQueuePop(MyQueue* obj)
{
if (!myQueueEmpty(obj))
{
return obj->data[obj->top--];
}
return NULL;
}
int myQueuePeek(MyQueue* obj)
{
if (!myQueueEmpty(obj))
{
int res = 0;
res = obj->data[obj->top];
return res;
}
return NULL;
}
void myQueueFree(MyQueue* obj)
{
if (obj)
{
free(obj);
}
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版