232.用栈实现队列
题目
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
- void push(int x) 将元素 x 推到队列的末尾
- int pop() 从队列的开头移除并返回元素
- int peek() 返回队列开头的元素
- boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 isempty 操作是合法的。
- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
来源:力扣(LeetCode)
链接:用栈实现队列
解法
思路
做两个栈,输入栈和输出栈
- 从输入栈进栈
- 判断输出栈是否为空,为空
- 将输入栈的数据导入到输出栈
- 判断输出栈是否为空,不为空
- (两种情况:(1) 输出栈本来就有数据 (2) 从输入栈中导入的数据)
- 将输出栈的数据导出
- 如果进栈和出栈都为空的话,则队列为空了
class MyQueue {
// 输入栈
Stack<Integer> inStack;
// 输出栈
Stack<Integer> outStack;
public MyQueue() {
// 负责进栈
inStack = new Stack<>();
// 负责出栈
outStack = new Stack<>();
}
public void push(int x) {
// 从输入栈进栈
inStack.push(x);
}
public int pop() {
// 判断输出栈是否为空
if(outStack.isEmpty()){
// 将输入栈的数据导入到输出栈
while(!inStack.isEmpty()){
outStack.push(inStack.pop());
}
}
// 不为空
// 将输出栈的数据导出
return outStack.pop();
}
public int peek() {
// 判断输出栈是否为空
if(outStack.isEmpty()){
// 将输入栈的数据导入到输出栈
while(!inStack.isEmpty()){
outStack.push(inStack.pop());
}
}
return outStack.peek();
}
public boolean empty() {
// 如果进栈和出栈都为空的话,则队列为空了
return inStack.isEmpty() && outStack.isEmpty();
}
}
225.用队列实现栈
题目
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
- void push(int x) 将元素 x 压入栈顶。
- int pop() 移除并返回栈顶元素。
- int top() 返回栈顶元素。
- boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
注意:
- 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty这些操作。
- 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
来源:力扣(LeetCode)
链接:用队列实现栈
解法一(两个队列)
- 时间复杂度: push为O(n),其他为O(1)
- 空间复杂度: O(n)
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
//初始化队列
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
//在第二个栈中插入元素
queue2.offer(x);
//判断第一个栈不为空
while(!queue1.isEmpty()){
//将第一个栈中的元素弹出并添加到第二个栈中
queue2.offer(queue1.poll());
}
//创建一个辅助栈,并将第二个栈中元素赋给第一个栈
Queue<Integer> queueTemp;
queueTemp = queue1;
queue1 = queue2;
queue2 = queueTemp;
}
//删除队列中的元素
public int pop() {
return queue1.poll();
}
//返回栈顶元素
public int top() {
return queue1.peek();
}
//判断是否为空
public boolean empty() {
return queue1.isEmpty();
}
}
解法二(一个队列)
- 时间复杂度: push为O(n),其他为O(1)
- 空间复杂度: O(n)
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
//插入操作
public void push(int x) {
//队列元素个数
int len = queue.size();
//将要加入的元素添加到队列中
queue.offer(x);
//遍历队列中新加入的元素和之前的元素,将其逐个加入到队尾
while(len-- > 0){
queue.offer(queue.poll());
}
}
//删除队列中的元素
public int pop() {
return queue.poll();
}
//返回栈顶元素
public int top() {
return queue.peek();
}
//判断是否为空
public boolean empty() {
return queue.isEmpty();
}
}