最近一直在忙一些个人的私事,导致好多计划都中断了。说多了都是借口,归根结底是自己没有规划好时间,坚持做下去,下面回正题继续做题。
Implement the following operations of a stack using queues.
push(x) -- Push element x onto stack.
pop() -- Removes the element on top of the stack.
top() -- Get the top element.
empty() -- Return whether the stack is empty.
思路:
一、自己的第一个思路是用两个queue和一个变量top,一个queue专门负责存push进来的元素,一个queue负责在pop的时候临时存放push queue中前n-1个元素,top用来存当前最后一个push进来的元素。
在pop的时候,需要先把push queue前n-1个元素移动到pop queue,把push queue最后一个元素remove以后,再把push queue和pop queue交换。
二、在solution里看到第三种方法十分巧妙,用一个queue就可以实现。每次push把元素添加到队列以后,就把队列前n-1个元素重新入队。下面以依次push 1到4为例:
1-->1,2-->2,1-->2,1,3-->3,2,1-->3,2,1,4-->4,3,2,1
可以看到每次push元素后,队列就变成了相应的stack表达。
下面发一下第二种方法的代码:
public class HA_StackByQueue {
private Queue<Integer> queue;
/** Initialize your data structure here. */
public HA_StackByQueue() {
this.queue = new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
this.queue.offer(x);
int size = this.queue.size();
while (size > 1) {
this.queue.offer(this.queue.poll());
size--;
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
return this.queue.poll();
}
/** Get the top element. */
public int top() {
return this.queue.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return this.queue.isEmpty();
}
}