简单算法记载。剑指 Offer 09。
1.双栈实现队列
算法要求:
- 使用两个栈来实现队列。
- 要求只能使用栈特性相关的操作,如push,pop,peek,isEmpty等。
- 要求要能实现队列特性相关的操作,如push,pop,peek,isEmpty等。
实现思想:
- 一个栈用于输入,一个栈用于输出。
- 队列的所有push操作交给输入栈。
- 当队列需要pop或者peek时,先看输出栈中是否有元素,有直接进行相关操作,没有就将输入栈倒置到输出栈中,再使用输出栈来进行相关操作。
- 利用的核心思想是:栈倒置后的顺序就是队列的顺序。
实现代码:
-
时间复杂度:均摊复杂度为O(1)。
-
空间复杂度:对n次push操作,栈中会有n个元素,故为O(N)。
class MyQueue {
Deque<Integer> in;
Deque<Integer> out;
/** Initialize your data structure here. */
public MyQueue() {
in=new LinkedList<>();
out=new LinkedList<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
in.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(out.isEmpty()){
sout();
}
return out.pop();
}
/** Get the front element. */
public int peek() {
if(out.isEmpty()){
sout();
}
return out.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return in.isEmpty()&&out.isEmpty();
}
public void sout(){
while(!in.isEmpty()){
out.push(in.pop());
}
}
}
2.单队列实现栈
算法要求:
- 使用一个队列来实现栈。
- 要求只能使用队列特性相关的操作,如push,pop,peek,isEmpty等。
- 要求要能实现栈特性相关的操作,如push,pop,peek,isEmpty等。
实现思想:
- 队列每push一个元素时,就将队列从队首开始的元素依次加入队尾,这样新加入进去的元素,一定是先取出的。
- 利用的核心思想是:队列倒置后的顺序就是栈的顺序。
实现代码:
- 时间复杂度:入栈操作为O(n),其它操作为O(1)。
- 空间复杂度:O(n)。
class MyStack {
Deque<Integer> q;
/** Initialize your data structure here. */
public MyStack() {
q=new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
int n=q.size();
q.offer(x);
for(int i=0;i<n;i++){
q.offer(q.poll());
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
return q.poll();
}
/** Get the top element. */
public int top() {
return q.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return q.isEmpty();
}
}