225. Implement Stack using Queues
题目:
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.
Notes:
- 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.
链接: http://leetcode.com/problems/implement-stack-using-queues/
题解:
一开始想使用两个Queue,来回倒腾一下就可以得到结果,但这样基本每个op都是O(n)。后来看了Discuss,发现一个Queue就可以,然后只有Push()的Complexity - O(n),应该算是optimal了。不过仔细想一想其实Push最好能是O(1),因为这个用得应该最频繁。 下面做法主要就是在push的时候把当前值放在队尾,以前的值我们重新放在队尾。
Time Complexity - Push - O(n), Pop - O(1), Peek - O(1), isEmpty- O(1)
class MyStack { // Push element x onto stack. Queue<Integer> q; public MyStack() { q = new LinkedList<>(); } public void push(int x) { q.offer(x); for(int i = 0; i < q.size() - 1; i++) { q.offer(q.peek()); q.poll(); } } // Removes the element on top of the stack. public void pop() { q.poll(); } // Get the top element. public int top() { return q.peek(); } // Return whether the stack is empty. public boolean empty() { return q.size() == 0; } }
二刷:
使用一个queue来求解,每次push的时候把q头部poll出的数字再加回到尾部
Java:
Time Complexity - Push - O(n), Pop - O(1), Peek - O(1), isEmpty- O(1)
class MyStack { // Push element x onto stack. Queue<Integer> q = new LinkedList(); public void push(int x) { q.offer(x); for (int i = 0; i < q.size() - 1; i++) { q.offer(q.poll()); } } // Removes the element on top of the stack. public void pop() { q.poll(); } // Get the top element. public int top() { return q.peek(); } // Return whether the stack is empty. public boolean empty() { return q.size() == 0; } }
三刷:
Java:
class MyStack { private Queue<Integer> q = new LinkedList<>(); // Push element x onto stack. public void push(int x) { q.offer(x); for (int i = q.size() - 2; i >= 0; i--) { q.offer(q.poll()); } } // Removes the element on top of the stack. public void pop() { q.poll(); } // Get the top element. public int top() { return q.peek(); } // Return whether the stack is empty. public boolean empty() { return q.isEmpty(); } }
Update: 不过实际运行速度比较慢啊
Time Complexity - Push - O(n), Pop - O(1), Peek - O(1), isEmpty- O(1)
class MyStack { Queue<Integer> q = new LinkedList<>(); // Push element x onto stack. public void push(int x) { q.offer(x); int len = q.size(); while (len > 1) { q.offer(q.poll()); len--; } } // Removes the element on top of the stack. public void pop() { q.poll(); } // Get the top element. public int top() { return q.peek(); } // Return whether the stack is empty. public boolean empty() { return q.isEmpty(); } }
Reference:
https://leetcode.com/discuss/46975/a-simple-c-solution
https://leetcode.com/discuss/40202/only-push-others-using-queue-combination-shared-solutions
https://leetcode.com/discuss/84233/solutions-about-which-utilizes-queue-others-utilize-queues
https://leetcode.com/discuss/39839/o-1-purely-with-queues