210 likes | 286 Views
Stack and Queue. Stack From Two Queues. Describe how to implement the stack ADT using two queues The solution should only use the standard queue operations: ENQUEUE , DEQUEUE , IS-EMPTY What will be the running times of the PUSH and POP operations?. Stack From Two Queues – Solution.
E N D
Stack From Two Queues • Describe how to implement the stack ADT using two queues • The solution should only use the standard queue operations:ENQUEUE, DEQUEUE, IS-EMPTY • What will be the running timesof the PUSH and POP operations?
Stack From Two Queues – Solution • We will call the two queues Q1 and Q2 • Additionally, we will hold a variable called curQueue, which points to the queue that holds the last value pushed to our stack • Initialization: curQueue Q1
Stack From Two Queues – Solution (continued) IS-EMPTY return IS-EMPTY (curQueue) PUSH (val) ENQUEUE (curQueue, val) TOP val POP PUSH (val) returnval
Stack From Two Queues – Solution (continued) POP otherQueue(curQueue = Q1)? Q2: Q1 while (!IS-EMPTY (curQueue)) temp DEQUEUE (curQueue) if (!IS-EMPTY (curQueue)) // Not last? ENQUEUE (otherQueue, temp) curQueueotherQueue returntemp
Stack From Two Queues – Solution Complexity • Since PUSH is simply implemented as a single ENQUEUE operation, its running time is O(1) • For POP operations, we always need to transfer the complete stack contents from one queue to the other, therefore performing a POP takes O(n) time
Two Stacks in a Single Array • Describe how to implement two stacks inside a single array • The total number of elements in both stacks is limited by the array length • Therefore, just splitting the array into two equally-sized parts will not do • All stack operations should run in O(1)
Two Stacks in a Single Array – Solution Concept • We are given an array A with n elements, numbered 0 to n – 1 • We define two markers t1 and t2that point to the next free cell instacks S1 and S2 respectively • Initialization: • t1 = 0 • t2 = n – 1
Two Stacks in a Single Array – Solution Concept • S1 grows up from the beginning of the array, S2 grows down from its end • We know that the array is full when the two markers switch places (t1 > t2) • The complexity is O(1) for all operations • The array usage is optimal
Two Stacks in a Single Array – Solution Visualization S1 S2 t1 t2
Two Stacks in a Single Array – Solution Details S1.IS-EMPTY if (t1 = 0) return true else return false S2.IS-EMPTY if (t2 = n - 1) return true else return false
Two Stacks in a Single Array – Solution Details (continued) S1.PUSH (val) if (t1 > t2) error "stack overflow" A[t1] = val t1++ S2.PUSH (val) if (t1 > t2) error "stack overflow" A[t2] = val t2--
Two Stacks in a Single Array – Solution Details (continued) S1.POP if (t1 = 0) error "stack underflow" t1-- returnA[t1] S2.POP if (t2 = n - 1) error "stack underflow" t2++ returnA[t2]
Two Stacks in a Single Array – Solution Details (continued) S1.TOP if (t1 = 0) error "stack is empty" returnA[t1] S2.TOP if (t2 = n - 1) error "stack is empty" returnA[t2]
Evaluating Arithmetic Expressions • Fully parenthesized arithmetic expressions can be evaluated using Dijkstra's two-stack algorithm • Uses two separate stacks – one for the operators and another for the operands • See Java code in: Evaluate.java.html
Deque(or Double-Ended Queue) • A deque is a generalization of the Queue ADT, that supports reading and writing from both ends of the queue • We would like to support an input-restricted deque : • Deletion can be made from both ends • Input can only be made at one end
Deque • We note that an input-restricted deque is a combination of a queue and a stack • We use a standard queue, and modify it to also support PUSH and POP • The tail (or rear) of the queue will also be used as the stack top
Deque • Implementing PUSH is now trivial – simply call ENQUEUE • POP is very similar to DEQUEUE, accept that it returns tail instead of head • The same IS-EMPTY function will work for both the stack and the queue • Check if head = tail
Deque ENQUEUE PUSH POP DEQUEUE head(front) tail(rear)