This updated information has been further expanded upon on my new website. You can find the updated details here: https://k5kc.com/cs/algorithms/implement-queue-using-stacks/.
ProblemImplement a Queue using two stacks.
Solution
Logic :
- We'll implement a FIFO queue using two stacks.Lets call the stacks Instack and Outstack.
- An element is inserted in the queue by pushing it into the Instack.
- An element is extracted from the queue by popping it from the Outstack.
- If the Outstack is empty then all elements currently in Instack are transferred to Outstack but in the reverse order.
Example
- Enqueue 3, 4,
- Dequeue
- Enqueue 5, 6
- Dequeue
- Dequeue
At step 2, InStack={} , OutStack{3,4}, note that order is reversed. Top points to 3. Now, we pop the item, hence we pop out 3. OutStack={4}
At Step 3, InStack={6, 5}, OutStack={4}
At Step 4, InStack={6, 5}, OutStack={}, 4 is popped out of OutStack
At Step 5, again, InStack={}, OutStack={5,6} = OutStack{6} , and 5 is popped out.
Stack interface
public interface Stack { void push( Object x ); Object pop( ); Object top( ); boolean isEmpty( ); void makeEmpty( ); }
Now we come to actual class that implements a Queue using two stacks.
Code(Java):
public class StackQueue { ArrayStack inStack = new ArrayStack(); ArrayStack outStack = new ArrayStack(); public void enqueue(Object value) { inStack.push(value); } public Object dequeue() { if(outStack.isEmpty()) { while( ! inStack.isEmpty()) { outStack.push(inStack.pop()); } } return outStack.pop(); } public static void main(String[] args) { stackQueue queue = new stackQueue(); queue.enqueue(new String("first")); queue.enqueue(new String("second")); queue.enqueue(new String("third")); queue.enqueue(new String("fourth")); queue.enqueue(new String("fifth")); System.out.println("1. " + queue.dequeue()); System.out.println("2. " + queue.dequeue()); System.out.println("3. " + queue.dequeue()); System.out.println("4. " + queue.dequeue()); System.out.println("5. " + queue.dequeue()); } }
But can we implement queue, using 1 stack only?
Answer is yes, We can have 1 primary stack. We can get another temporary stack using call stack of recursion.
Steps remain the same:
- You need to transfer elements from one stack to another temporary stack, to reverse their order.
- Then push the new element to be inserted, onto the temporary stack
- Then transfer the elements back to the original stack
- The new element will be on the bottom of the stack, and the oldest element is on top (first to be popped)
Here is the code(java):
public class SimulatedQueue<E> { private java.util.Stack<E> stack = new java.util.Stack<E>(); public void insert(E elem) { if (!stack.empty()) { E topElem = stack.pop(); insert(elem); stack.push(topElem); } else stack.push(elem); } public E remove() { return stack.pop(); } }
Source
0 comments:
Post a Comment