1 / 14

STACK AND ITS IMPLEMENTATION

STACK AND ITS IMPLEMENTATION. RIZWAN REHMAN CCS,DIBRUGARH UNIVERSITY. Array implementation of stacks. To implement a stack, items are inserted and removed at the same end (called the top )

king
Télécharger la présentation

STACK AND ITS IMPLEMENTATION

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. STACK AND ITS IMPLEMENTATION RIZWAN REHMAN CCS,DIBRUGARH UNIVERSITY

  2. Array implementation of stacks • To implement a stack, items are inserted and removed at the same end (called the top) • Efficient array implementation requires that the top of the stack be towards the center of the array, not fixed at one end • To use an array to implement a stack, you need both the array itself and an integer • The integer tells you either: • Which location is currently the top of the stack, or • How many elements are in the stack

  3. stk: 0 1 2 3 4 5 6 7 8 9 17 23 97 44 top = 3 Pushing and popping • If the bottom of the stack is at location 0, then an empty stack is represented by top = -1 or count = 0 • To add (push) an element, either: • Increment top and store the element in stk[top], or • Store the element in stk[count] and increment count • To remove (pop) an element, either: • Get the element from stk[top] and decrement top, or • Decrement count and get the element in stk[count] or count = 4

  4. stk: 0 1 2 3 4 5 6 7 8 9 17 23 97 44 top = 2 After popping • When you pop an element, do you just leave the “deleted” element sitting in the array? • The surprising answer is, “it depends” • If this is an array of primitives, or if you are programming in C or C++, then doing anything more is just a waste of time • If you are programming in Java, and the array contains objects, you should set the “deleted” array element to null • Why? To allow it to be garbage collected! or count = 3

  5. Error checking • There are two stack errors that can occur: • Underflow: trying to pop (or peek at) an empty stack • Overflow: trying to push onto an already full stack • For underflow, you should throw an exception • If you don’t catch it yourself, Java will throw an ArrayIndexOutOfBounds exception • You could create your own, more informative exception • For overflow, you could do the same things • Or, you could check for the problem, and copy everything into a new, larger array

  6. Pointers and references • In C and C++ we have “pointers,” while in Java we have “references” • These are essentially the same thing • The difference is that C and C++ allow you to modify pointers in arbitrary ways, and to point to anything • In Java, a reference is more of a “black box,” or ADT • Available operations are: • dereference (“follow”) • copy • compare for equality • There are constraints on what kind of thing is referenced: for example, a reference to an array of int can only refer to an array of int

  7. myStack: 44 97 23 17 Linked-list implementation of stacks • Since all the action happens at the top of a stack, a singly-linked list (SLL) is a fine way to implement it • The header of the list points to the top of the stack • Pushing is inserting an element at the front of the list • Popping is removing an element from the front of the list

  8. Linked-list implementation details • With a linked-list representation, overflow will not happen (unless you exhaust memory, which is another kind of problem) • Underflow can happen, and should be handled the same way as for an array implementation • When a node is popped from a list, and the node references an object, the reference (the pointer in the node) does not need to be set to null • Unlike an array implementation, it really is removed--you can no longer get to it from the linked list • Hence, garbage collection can occur as appropriate

  9. Observations on Stack & Linear List • Stack is a restricted version of linear list • All the stack operations can be performed as linear list operations • If we designate the left end of the list as the stack bottom and the right as the stack top • Stack add (push) operation is equivalent to inserting at the right end of a linear list • Stack delete (pop) operation is equivalent to deleting from the right end of a linear list

  10. Creating references • The keyword new creates a new object, but also returns a reference to that object • For example, Person p = new Person("John") • new Person("John") creates the object and returns a reference to it • We can assign this reference to p, or use it in other ways

  11. Stack ADT AbstractDataType stack { instances linear list of elements; one end is the bottom; the other is the top. operations empty() : Return true if stack is empty, return false otherwise; size() : Return the number of elements in the stack; top() : Return top element of stack; pop() : Remove the top element from the stack; push(x) : Add element x at the top of the stack; }

  12. Application: Parenthesis Matching • Problem: match the left and right parentheses in a character string • (a*(b+c)+d) • Left parentheses: position 0 and 3 • Right parentheses: position 7 and 10 • Left at position 0 matches with right at position 10 • (a+b))*((c+d) • (0,4) • Right parenthesis at 5 has no matching left parenthesis • (8,12) • Left parenthesis at 7 has no matching right parenthesis

  13. Parenthesis Matching • (((a+b)*c+d-e)/(f+g)-(h+j)*(k-1))/(m-n) • Output pairs (u,v) such that the left parenthesis at position u is matched with the right parenthesis at v. (2,6) (1,13) (15,19) (21,25) (27,31) (0,32) (34,38) • How do we implement this using a stack? • Scan expression from left to right • When a left parenthesis is encountered, add its position to the stack • When a right parenthesis is encountered, remove matching position from the stack

  14. 2 1 1 15 21 0 0 0 0 0 0 0 Example of Parenthesis Matching (((a+b)*c+d-e)/(f+g)-(h+j)*(k-1))/(m-n) … stack … (15,19) (21,25) output (1,13) (2,6)

More Related