问题描述:
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.
- You must use only standard operations of a queue -- which means only
push to back
,peek/pop from front
,size
, andis empty
operations are valid. - Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue.
- You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).
思考:
和用两个栈实现队列不同,由于两种数据结构的进出方向不同,用队列实现栈需要做一些转换,以至于在出栈的时候需要删除最近添加的元素,思路是,使用两个队列并且始终只用一个队列维持一个反向栈,另一个为空,这样在删除的时候就会删除最近添加的值。
代码(java):
public class ImplementStackUsingQueues {
Queue<Integer> queueLeft = new LinkedList<Integer>();
Queue<Integer> queueRight = new LinkedList<Integer>();
// Push element x onto stack.
public void push(int x) {
if(queueLeft.size() == 0 ){
queueLeft.offer(x);
while(queueRight.size() != 0){
queueLeft.offer(queueRight.poll());
}
}
else{
queueRight.offer(x);
while(queueLeft.size() != 0){
queueRight.offer(queueLeft.poll());
}
}
}
// Removes the element on top of the stack.
public void pop() {
if(queueLeft.size() != 0 ){
queueLeft.poll();
}
else{
queueRight.poll();
}
}
// Get the top element.
public int top() {
if(queueLeft.size() != 0 ){
return queueLeft.element();
}
else{
return queueRight.element();
}
}
// Return whether the stack is empty.
public boolean empty() {
return ((queueLeft.size()==0) && (queueRight.size()==0));
}
}