X Tutup
E 1525667621 tags: Stack, Design 如题. #### Queue, 倒水 - 两个Queue,交互倒水 - 用一个Temp做swap ##### 做法1 - 逻辑在push里面: - 1. x 放q2。 - 2. q1全部offer/append到q2. - 3. 用一个Temp做swap q1, q2. - q1的头,就一直是最后加进去的值. ##### 做法2 - 逻辑在top()/pop()里, 每次换水,查看末尾项. ``` /* LeetCode: 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). Credits: Special thanks to @jianchao.li.fighter for adding this problem and all test cases. */ class MyStack { Queue queue; Queue tempQueue; /** Initialize your data structure here. */ public MyStack() { queue = new LinkedList<>(); tempQueue = new LinkedList<>(); } /** Push element x onto stack. */ public void push(int x) { tempQueue = queue; queue = new LinkedList<>(); queue.offer(x); while (!tempQueue.isEmpty()) { queue.offer(tempQueue.poll()); } } /** 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(); } } /* Thoughts: 1. When top()/pop() on the queue, we need to consume all the items on that queue first, then return the last item. 2. Need to save the consumed items back to the queue. */ class MyStack { private Queue queue; private Queue tempQueue; /** Initialize your data structure here. */ public MyStack() { queue = new LinkedList<>(); tempQueue = new LinkedList<>(); } /** Find the top and backfill queue with all consumed items */ private int findTop() { while (queue.size() > 1) { tempQueue.offer(queue.poll()); } int num = queue.poll(); queue = tempQueue; tempQueue = new LinkedList<>(); return num; } /** Push element x onto stack. */ public void push(int x) { queue.offer(x); } /** Removes the element on top of the stack and returns that element. */ public int pop() { return findTop(); } /** Get the top element. */ public int top() { int num = findTop(); queue.offer(num); return num; } /** Returns whether the stack is empty. */ public boolean empty() { return queue.isEmpty(); } } /** * Your MyStack object will be instantiated and called as such: * MyStack obj = new MyStack(); * obj.push(x); * int param_2 = obj.pop(); * int param_3 = obj.top(); * boolean param_4 = obj.empty(); */ /* LintCode: Implement Stack by Two Queues Implement a stack by two queues. The queue is first in first out (FIFO). That means you can not directly pop the last element in a queue. Have you met this question in a real interview? Yes Example push(1) pop() push(2) isEmpty() // return false top() // return 2 pop() isEmpty() // return true Tags Expand Stack Queue */ /* Thoughts: 2 queue are like two cups. We are fliping water into/out between q1 and q2. pop and top are fliping water. Use p1 as the base. */ class Stack { private Queue q1 = new LinkedList(); private Queue q2 = new LinkedList(); // Push a new item into the stack public void push(int x) { q1.offer(x); } // Pop the top of the stack public void pop() { while (q1.size() > 1) { q2.offer(q1.poll()); } q1.poll(); swap(); } // Return the top of the stack public int top() { while (q1.size() > 1) { q2.offer(q1.poll()); } int rst = q1.poll(); q2.offer(rst); swap(); return rst; } public void swap(){ Queue temp = q1; q1 = q2; q2 = temp; } // Check the stack is empty or not. public boolean isEmpty() { return q1.isEmpty(); } } ```
X Tutup