1 / 22

Introduction to Data Structures and Algorithms

Introduction to Data Structures and Algorithms. Chapter 4 Stacks and Queues. What is queue? A collection of items that can be inserted at the tail end removed at the head Items must be removed in the same order of that in which they are inserted into the queue FIFO: first in and first out.

mei
Download Presentation

Introduction to Data Structures and Algorithms

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. Introduction to Data Structures and Algorithms Chapter 4 Stacks and Queues

  2. What is queue? • A collection of items that can be inserted at the tail end removed at the head • Items must be removed in the same order of that in which they are inserted into the queue • FIFO: first in and first out

  3. queue specification: • isEmpty() • Return true if the queue is empty; o.w, false • peekfront() • Return the head item without removing it from the queue • remove • Return the head item and remove it from the queue • insert • Insert a new item into tail of the queue • size • Return the number of items in the queue • queue demo:

  4. Problem? • two pointers: head and tail • dynamic changing, figure 4.7 on page 135 • when head moves up to the top and tail is somewhere in between • Can you insert a new item? • How to solve the problem? • Figure 4.8, 4.9 on page 136, 137

  5. class Queue { private int maxSize; private long[] queArray; private int front; private int rear; private int nItems; public void insert(long j) // put item at rear of queue { if(rear == maxSize-1) // deal with wraparound rear = -1; queArray[++rear] = j; // increment rear and insert nItems++; // one more item } public long remove() // take item from front of queue { long temp = queArray[front++]; // get value and incr front if(front == maxSize) // deal with wraparound front = 0; nItems--; // one less item return temp; } public long peekFront() // peek at front of queue { return queArray[front]; } public int size() // number of items in queue { return nItems; } } // end class Queue

  6. Exercise: • Check if a stack with n elements contains a particular element x (constraint: you must restore the original stack elements after checking) • Additional data structure: Stack

  7. What is priority queue? • Priority queue and queue are two different data structures • “Sorted” items • Item with the highest priority (lowest key or highest key) always at the head (not FIFO) • Highly restricted access! • New item is inserted in the proper position to maintain the order, not necessarily at the tail (similar to sorted array)

  8. Priority queue operations • Insert • Find proper position for the new elements • Shift elements with lower key (higher key) up • Delete • Always the head element of the priority queue • Peek • Return a copy of head element without removing it • Demo

  9. class PriorityQ { private int maxSize; private long[] queArray; private int nItems; //------------------------------------------------------------- public void insert(long item) // insert item { int j; if(nItems==0) // if no items, queArray[nItems++] = item; // insert at 0 else // if items, { for(j=nItems-1; j>=0; j--) // start at end, { if( item > queArray[j] ) // if new item larger, queArray[j+1] = queArray[j]; // shift upward else // if smaller, break; // done shifting } // end for queArray[j+1] = item; // insert it nItems++; } // end else (nItems > 0) } // end insert()//------------------------------------------------------------- public long remove() // remove minimum item { return queArray[--nItems]; }//------------------------------------------------------------- public long peekMin() // peek at minimum item { return queArray[nItems-1]; }//------------------------------------------------------------- } // end class PriorityQ

  10. public void insertionSort() {int in, out;for(out=1; out<nElems; out++) { long temp = a[out]; in = out; while(in>0 && a[in-1] >= temp) { a[in] = a[in-1]; --in; } a[in] = temp; } // end for } // end insertionSort() public void insert(long item) { int j; if(nItems==0), queArray[nItems++] = item; else {for(j=nItems-1; j>=0; j--), { if( item > queArray[j] ), queArray[j+1] = queArray[j]; else break; } queArray[j+1] = item; nItems++; } // end else (nItems > 0) } // end insert() Excise: make insert() O(1) while remove() takes longer time

  11. Parsing Arithmetic Expressions (Application of Stack) • Infix notation • operator is placed between operands • a+b • Postfix notation • Operator follows the operands • ab+ • Prefix notation • Operator is before the operands • +ab • More postfix examples • Page 150 table 4.2 • Postfix: No delimiters • How can the computer figure out the value of an arithmetic expressions? • 3+4*5

  12. Translating infix to postfix • Algorithm (page 159, Table 4-10) • Input: infix arithmetic expression • Output: postfix representation of input • Data structures: stack • Running time: O(n) • Example: 3+4*5 • Infix: 3+4*5 • Postfix: 345*+ • more examples: • a*(b+c) • a+b*(c-d)

  13. class InToPost // infix to postfix conversion { private StackX theStack; private String input; private String output = "";//-------------------------------------------------------------- public InToPost(String in) // constructor { input = in; int stackSize = input.length(); theStack = new StackX(stackSize); }//-------------------------------------------------------------- public String doTrans() // do translation to postfix { ………(next slide) } // end doTrans()//-------------------------------------------------------------- public void gotOper(char opThis, int prec1) { // got operator from input ……..(next slide) } // end gotOp()//-------------------------------------------------------------- public void gotParen(char ch) { // got right paren from input ………(next slide) } // end popOps()//-------------------------------------------------------------- } // end class InToPost

  14. public void gotOper(char opThis, int prec1) { // got operator from input while( !theStack.isEmpty() ) { char opTop = theStack.pop(); if( opTop == '(' ) // if it's a '(' { theStack.push(opTop); // restore '(' break; } else // it's an operator { int prec2; // precedence of new op if(opTop=='+' || opTop=='-') // find new op prec prec2 = 1; else prec2 = 2; if(prec2 < prec1) // if prec of new op less { // than prec of old theStack.push(opTop); // save newly-popped op break; } else // prec of new not less output = output + opTop; // than prec of old } // end else (it's an operator) } // end while theStack.push(opThis); // push new operator } // end gotOp()

  15. public void gotParen(char ch) { // got right paren from input while( !theStack.isEmpty() ) { char chx = theStack.pop(); if( chx == '(' ) // if popped '(' break; // we're done else // if popped operator output = output + chx; // output it } // end while } // end popOps()

  16. public String doTrans() // do translation to postfix { for(int j=0; j<input.length(); j++) // for each char { char ch = input.charAt(j); // get it theStack.displayStack("For "+ch+" "); // *diagnostic* switch(ch) { case '+': // it's + or - case '-': gotOper(ch, 1); // go pop operators break; // (precedence 1) case '*': // it's * or / case '/': gotOper(ch, 2); // go pop operators break; // (precedence 2) case '(': // it's a left paren theStack.push(ch); // push it break; case ')': // it's a right paren gotParen(ch); // go pop operators break; default: // must be an operand output = output + ch; // write it to output break; } // end switch } // end for while( !theStack.isEmpty() ) // pop remaining opers { theStack.displayStack("While "); // *diagnostic* output = output + theStack.pop(); // write to output } theStack.displayStack("End "); // *diagnostic* return output; // return postfix } // end doTrans()

  17. class InfixApp { public static void main(String[] args) throws IOException { String input, output; while(true) { System.out.print("Enter infix: "); System.out.flush(); input = getString(); // read a string from kbd if( input.equals("") ) // quit if [Enter] break; // make a translator InToPost theTrans = new InToPost(input); output = theTrans.doTrans(); // do the translation System.out.println("Postfix is " + output + '\n'); } // end while } // end main()

  18. Evaluate postfix expression • Algorithm (p.168) • Input: postfix expression • Output: computation result • Data structures: stack • Running time: O(n) • Example: 345+*612+/-

  19. class ParsePost { private StackX theStack; private String input; public ParsePost(String s) { input = s; } public int doParse() { …..(next slide) } // end doParse() } // end class ParsePost

  20. public int doParse() { theStack = new StackX(20); // make new stack char ch; int j; int num1, num2, interAns; for(j=0; j<input.length(); j++) // for each char, { ch = input.charAt(j); // read from input theStack.displayStack(""+ch+" "); // *diagnostic* if(ch >= '0' && ch <= '9') // if it's a number theStack.push( (int)(ch-'0') ); // push it else // it's an operator { num2 = theStack.pop(); // pop operands num1 = theStack.pop(); switch(ch) // do arithmetic { case '+': interAns = num1 + num2; break; case '-': interAns = num1 - num2; break; case '*': interAns = num1 * num2; break; case '/': interAns = num1 / num2; break; default: interAns = 0; } // end switch theStack.push(interAns); // push result } // end else } // end for interAns = theStack.pop(); // get answer return interAns; } // end doParse()

  21. class PostfixApp { public static void main(String[] args) throws IOException { String input; int output; while(true) { System.out.print("Enter postfix: "); System.out.flush(); input = getString(); // read a string from kbd if( input.equals("") ) // quit if [Enter] break; // make a parser ParsePost aParser = new ParsePost(input); output = aParser.doParse(); // do the evaluation System.out.println("Evaluates to " + output); } // end while } // end main() }

  22. Excises (please refer to handout Class 13)

More Related