题目:
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.
Example:
MyStack stack = new MyStack();
stack.push(1);
stack.push(2);
stack.top(); // returns 2
stack.pop(); // returns 2
stack.empty(); // returns false
Notes:
- You must use only standard operations of a queue – which means only push to back, peek/pop from front, size, and is 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).
解答:
每次 push() 通过遍历把新加入的值放在列表头部,从而可以直接实现 pop() 和 top() 功能
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<Integer>();
}
/** Push element x onto stack. */
public void push(int x) {
queue.add(x);
int size=queue.size();
while(size>1){
queue.add(queue.poll());
size--;
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
return queue.poll();
}
/** Get the top element. */
public int top() {
return queue.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return queue.isEmpty();
}
}
queue的常见用法
add()
向队列中增加一个元索,如果队列已满,则抛出一个IIIegaISlabEepeplian 异常
offer()
添加一个元素并返回true,如果队列已满,则返回false
put()
添加一个元素 如果队列满,则阻塞
poll()
移除并返问队列头部的元素,如果队列为空,则返回null
remove()
移除并返回队列头部的元素,如果队列为空,则抛出一个NoSuchElementException异常
peek()
返回队列头部的元素 如果队列为空,则返回null
element()
返回队列头部的元素,如果队列为空,则抛出一个NoSuchElementException异常
take()
移除并返回队列头部的元素 如果队列为空,则阻塞
offer() ,add() 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer() 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
poll() ,remove() 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
peek() ,element() 区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。