题目描述
使用栈实现队列的下列操作:
push(x)
– 将一个元素放入队列的尾部。pop()
– 从队列首部移除元素。peek()
– 返回队列首部的元素。empty()
– 返回队列是否为空。
样例
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
- 你只能使用标准的栈操作 – 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用
list
或者deque
(双端队列)来模拟一个栈,只要是标准的栈操作即可。 - 假设所有操作都是有效的 (例如,一个空的队列不会调用
pop
或者peek
操作)。
算法分析
用两个栈a
,b
模拟队列,a
是存元素的栈,b
是辅助栈(工具人)
- 1、
push(int x)
:直接将元素加入到a
栈中 - 2、
pop()
:假设a
栈中有n
个元素,则将n - 1
个元素先放到b
栈存着,弹出a
栈的元素,再把b
栈的n - 1
个元素重新放回a
栈中 - 3、
peek()
:假设a
栈中有n
个元素,则将n - 1
个元素先放到b
栈存着,输出a
栈的元素,再把b
栈的n - 1
个元素重新放回a
栈中 - 4、
empty()
:判断a
栈是否为空即可
时间复杂度
push(int x)
和empty()
操作 $O(1)$时间复杂度pop()
和peek()
操作 $O(n)$时间复杂度
Java 代码
class MyQueue {
static Stack<Integer> a = new Stack<Integer>();
static Stack<Integer> b = new Stack<Integer>();
/** Initialize your data structure here. */
public MyQueue() {
a.clear();
b.clear();
}
/** Push element x to the back of queue. */
public void push(int x) {
a.add(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
int n = a.size();
for(int i = 0;i < n - 1;i ++) b.add(a.pop());
int t = a.pop();
for(int i = 0;i < n - 1;i ++) a.add(b.pop());
return t;
}
/** Get the front element. */
public int peek() {
int n = a.size();
for(int i = 0;i < n - 1;i ++) b.add(a.pop());
int t = a.peek();
for(int i = 0;i < n - 1;i ++) a.add(b.pop());
return t;
}
/** Returns whether the queue is empty. */
public boolean empty() {
return a.isEmpty();
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/
呆呆的java题解写的相当不错哦,加油~~
冲