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, 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). Update (2015-06-11): The class name of the Java function had been updated to MyStack instead of Stack.
Better Solution: Only push is O(n), others are O(1). Using one queue.
1 class MyStack { 2 // Push element x onto stack. 3 Queue<Integer> queue; 4 5 public MyStack() { 6 this.queue = new LinkedList<Integer>(); 7 } 8 9 public void push(int x) { 10 queue.offer(x); 11 for (int i=1; i<=queue.size()-1; i++) { 12 queue.offer(queue.poll()); 13 } 14 } 15 16 // Removes the element on top of the stack. 17 public void pop() { 18 queue.poll(); 19 } 20 21 // Get the top element. 22 public int top() { 23 return queue.peek(); 24 } 25 26 // Return whether the stack is empty. 27 public boolean empty() { 28 return queue.isEmpty(); 29 } 30 }
就是两个queues, 轮流把除最后一个之外的都放入另一个queue中.
1 class MyStack { 2 // Push element x onto stack. 3 Queue<Integer> q1; 4 Queue<Integer> q2; 5 6 public MyStack() { 7 q1 = new LinkedList<Integer>(); 8 q2 = new LinkedList<Integer>(); 9 } 10 11 public void push(int x) { 12 q1.offer(x); 13 } 14 15 // Removes the element on top of the stack. 16 public void pop() { 17 if (q1.isEmpty()) return; 18 while (q1.size() > 1) { 19 q2.offer(q1.poll()); 20 } 21 q1.poll(); 22 q1 = q2; 23 q2 = new LinkedList<Integer>(); 24 } 25 26 // Get the top element. 27 public int top() { 28 if (q1.isEmpty()) return -1; 29 while (q1.size() > 1) { 30 q2.offer(q1.poll()); 31 } 32 int res = q1.poll(); 33 q1 = q2; 34 q1.offer(res); 35 q2 = new LinkedList<Integer>(); 36 return res; 37 } 38 39 // Return whether the stack is empty. 40 public boolean empty() { 41 return q1.isEmpty(); 42 } 43 }