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).
Update (2015-06-11):
The class name of the Java function had been updated to MyStack instead of Stack.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and all test cases.
Subscribe to see which companies asked this question
思路:
算法上大概也明白,需要用两个队列,来模拟堆栈。过程确实比较啰嗦。
代码在此。
然而我submit了不知道多少遍才换来accepted的结果。只因为一个错误:
for(int i = 0; i < tmp.size(); i++){
value.add(tmp.remove());
}
这样肯定行不通的好嘛!!
因为循环体里面,tmp.remove() 随时都在改变tmp的size啊!!我是有多愚!!
class MyStack {
// Push element x onto stack.
Queue<Integer> tmp = new LinkedList<Integer>();
Queue<Integer> value = new LinkedList<Integer>();
public void push(int x) {
tmp.add(x);
}
// Removes the element on top of the stack.
public void pop() {
if (!tmp.isEmpty()){
int s = tmp.size();
for(int i = 0; i < s-1; i++)
value.add(tmp.remove());
tmp.remove();
s = value.size();
for(int i = 0; i < s; i++)
tmp.add(value.remove());
}
return;
}
// Get the top element.
public int top() {
int res = 0;
int s = tmp.size();
for(int i = 0; i < s-1; i++)
value.add(tmp.remove());
res = tmp.element();
value.add(tmp.remove());
s = value.size();
for(int i = 0; i < s; i++)
tmp.add(value.remove());
return res;
}
// Return whether the stack is empty.
public boolean empty() {
return tmp.isEmpty();
}
}