题目大意:用队列来实现栈。
Problem:
https://leetcode.com/problems/implement-stack-using-queues/description/
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).
Idea:
Using a single queue, for every push, shift the queue (n – 1) times such that the last element becomes the first element in the queue.
e.g.
push(1): q: [1]
push(2): q: [1, 2] -> [2, 1]
push(3): q: [2, 1, 3] -> [1, 3, 2] -> [3, 2, 1]
push(4): q: [3, 2, 1, 4] -> [2, 1, 4, 3] -> [1, 4, 3, 2] -> [4, 3, 2, 1]
Solution:
Time complexity:
Push: O(n)
Pop/top/empty: O(1)
Space complexity: O(n)
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// Author: Huahua // Running time: 3 ms class MyStack { public: /** Initialize your data structure here. */ MyStack() {} /** Push element x onto stack. */ void push(int x) { q_.push(x); for (int i = 1; i < q_.size(); ++i) { q_.push(q_.front()); q_.pop(); } } /** Removes the element on top of the stack and returns that element. */ int pop() { int top = q_.front(); q_.pop(); return top; } /** Get the top element. */ int top() { return q_.front(); } /** Returns whether the stack is empty. */ bool empty() { return q_.empty(); } private: queue<int> q_; }; |