STACKS AND QUEUES - PowerPoint PPT Presentation

1 / 67
About This Presentation
Title:

STACKS AND QUEUES

Description:

special cases of the more general data type, ordered list. ADT stack - ordered list ... { short int vert; short int horiz; } offsets; offsets move[8] ... – PowerPoint PPT presentation

Number of Views:95
Avg rating:3.0/5.0
Slides: 68
Provided by: kowonDo
Category:
Tags: and | queues | stacks | vert

less

Transcript and Presenter's Notes

Title: STACKS AND QUEUES


1
Chapter 3 STACKS AND QUEUES Fundamentals of
Data Structure in C Horowitz, Sahni and
Anderson-Freed Computer Science Press July, 1997
2
Stacks
3
Stack Abstract Data Type
  • stack and queue
  • special cases of the more general data type,
    ordered list
  • ADT stack
  • - ordered list
  • - insertions and deletions are made
  • at one end called the top

4
Stack Abstract Data Type
  • given stack S (a0, , an-1)
  • a0 bottom element
  • an-1 top element
  • ai on top of element ai-1 (0ltiltn)
  • Last-In-First-Out (LIFO)
  • Inserting and deleting elements in a stack

5
Stack Abstract Data Type
  • Ex 3.1 System stack
  • system stack
  • - stack used by a program at run-time to process
    function calls
  • activation record(stack frame)
  • initially contain only
  • - a pointer to the previous stack frame
  • - a return address
  • if this invokes another function
  • - local variables
  • - parameters of the invoking function

6
Stack Abstract Data Type
  • system stack after function call
  • run-time program simply creates a new stack frame
  • (also for each recursive call)

7
Stack Abstract Data Type
  • structure Stack is
  • objects a finite ordered list with zero or more
    elements
  • functions
  • for all stack Î Stack, item Î element,
    max_stack_size Î positive integer
  • Stack CreateS(max_stack_size)
  • Boolean IsFull(stack, max_stack_size)
  • Stack Push(stack,item)
  • Boolean IsEmpty(stack)
  • Element Pop(stack)
  • abstract data type stack

8
Stack Abstract Data Type
  • Implementing a stack
  • - using a one-dimensional array
  • stackMAX_STACK_SIZE
  • where MAX_STACK_SIZE maximum
  • number of entries
  • define MAX_STACK_SIZE 100
  • typedef struct
  • int key
  • element
  • element stackMAX_STACK_SIZE
  • int top -1

9
Stack Abstract Data Type
  • structure element
  • - consists of only a key field
  • - we can add fields to or modify to
  • meet the requirements of the
  • application
  • IsEmpty(stack)
  • return (top lt 0)
  • IsFull(stack)
  • return (top gt MAX_STACK_SIZE-1)

10
Stack Abstract Data Type
  • Push(stack, item)
  • void push(int ptop, element item)
  • if (ptop gt MAX_STACK_SIZE - 1)
  • stack_full()
  • return
  • stackptop item
  • Pop(stack)
  • element pop(int ptop)
  • if (ptop -1)
  • return stack_empty()
  • return stack(ptop)--

11
Stack Abstract Data Type
  • application
  • - procedure calls/returns
  • - syntactic analyzer
  • - converting recursive procedures to
  • non-recursive procedures

12
Queues
13
Queue Abstract Data Type
  • ADT queue
  • - ordered list
  • - all insertions are made at one
  • end, called rear
  • - all deletion are made at the other
  • end, called front
  • - which item is to be removed first?
  • FIFO(First In First Out)
  • - all items except front/rear items
  • are hidden

14
Queue Abstract Data Type
  • inserting and deleting elements
  • in a queue

15
Queue Abstract Data Type
  • Implementing a queue
  • - the simplest scheme
  • a one-dimensional array, and
  • two variables front and rear
  • define MAX_QUEUE_SIZE 100
  • typedef struct
  • int key
  • / other fields /
  • element
  • element queueMAX_QUEUE_SIZE
  • int rear -1
  • int front -1

16
Queue Abstract Data Type
  • IsEmptyQ(queue)
  • return (front rear)
  • IsFullQ(queue)
  • return rear (MAX_QUEUE_SIZE-1)
  • void addq(int prear, element item)
  • if(prear MAX_QUEUE_SIZE - 1)
  • queue_full()
  • return
  • queueprear item
  • add to a queue

17
Queue Abstract Data Type
  • element deleteq(int pfront, int rear)
  • if (pfront rear)
  • return queue_empty()
  • return queuefront
  • delete from a queue
  • - in deleteq() rear is used to check
  • for an empty queue

18
Queue Abstract Data Type
  • Ex 3.2 job scheduling
  • creation of job queue
  • - in the operating system which does
  • not use priorities, jobs are
  • processed in the order they enter
  • the system
  • insertion and deletion from a
  • sequential queue

19
Queue Abstract Data Type
  • Problems
  • queue gradually shifts to the right
  • queue_full(rearMAX_QUEUE_SIZE-1)
  • signal does not always mean that
  • there are MAX_QUEUE_SIZE items in
  • queue
  • - there may be empty spaces available
  • - data movement O(MAX_QUEUE_SIZE)
  • - solutions circular queue

20
Circular Queues
21
Circular Queues
  • more efficient queue representation
  • - regard the array
  • queueMAX_QUEUE_SIZE as circular
  • - initially front and rear to 0
  • rather than -1
  • - the front index always points one
  • position counterclockwise from the
  • first element in the queue
  • - the rear index point to the
  • current end of the queue

22
Circular Queues
  • empty and nonempty circular queues

23
Circular Queues
full queue
full queue
  • full circular queues

2
3
2
3
1
4
1
4
0
5
0
5
front 0 rear 5
front 4 rear 3
24
Circular Queues
  • implementing add and delete for a
  • circular queue
  • - use modulus operator for circular
  • rotation
  • - circular rotation of the rear
  • rear (rear 1) MAX_QUEUE_SIZE
  • - circular rotation of the front
  • front (front 1) MAX_QUEUE_SIZE

25
Circular Queues
  • void addq(int front, int prear, element item)
  • prear (prear 1) MAX_QUEUE_SIZE
  • if (front prear)
  • queue_full(prear)
  • / reset rear and print error /
  • return
  • queueprear item
  • add to a circular queue
  • - rotate rear before we place the item
  • in queuerear

26
Circular Queues
  • element deleteq(int pfront, int rear)
  • element item
  • if (pfront rear)
  • return queue_empty()
  • / queue_empty returns an error key /
  • pfront (pfront 1) MAX_QUEUE_SIZE
  • return queuepfront
  • delete from a circular queue

27
Circular Queues
  • tests for a full queue and an empty
  • queue are the same
  • - distinguish between the case of
  • full and empty
  • 1) permitting a maximum of
  • MAX_QUEUE_SIZE - 1 rather than
  • MAX_QUEUE_SIZE elements, or
  • 2) add new variable
  • no data movement necessary
  • - ordinary queue O(n)
  • - circular queue O(1)

28
Mazing Problem
29
A Mazing Problem
  • the representation of the maze
  • - two-dimensional array
  • - element 0 open path
  • - element 1 barriers

entrance
exit
30
A Mazing Problem
  • allowable move

31
A Mazing Problem
  • rowcol which is on border
  • - has only three neighbors
  • - surround the maze by a border of
  • 1s
  • m p maze
  • - require (m 2) (p 2) array
  • - enterance position 11
  • - exit position mp

32
A Mazing Problem
  • typedef struct
  • short int vert
  • short int horiz
  • offsets
  • offsets move8
  • / array of moves for each direction /
  • table of move

33
A Mazing Problem
  • position of next move
  • - move from current position
  • mazerowcol
  • to the next position
  • mazenext_rownext_col
  • next_row row movedir.vert
  • next_col col movedir.horiz

34
A Mazing Problem
  • maintain a second two-dimensional
  • array, mark
  • - avoid returning to a previously
  • tried path
  • - initially, all entries are 0
  • - mark to 1 when the position is
  • visited

35
A Mazing Problem
  • initialize a stack to the mazes entrance
    coordinates and direction to north
  • while (stack is not empty)
  • / move to position at top of stack /
  • ltrow,col,dirgt delete from top of the stack
  • while (there are more moves from current
    position)
  • ltnext_row,next_colgt coordinates of next
    move
  • dir direction of move
  • if ((next_row EXIT_ROW) (next_col
    EXIT_COL)) success
  • if (mazenext_rownext_col 0
    marknext_rownext_col 0)
  • marknext_rownext_col 1
  • add ltrow,col,dirgt to the top of the
    stack
  • row next_row
  • col next_col
  • dir north
  • printf(no path found\n)

initial maze algorithm
36
A Mazing Problem
  • define MAX_STACK_SIZE 100
  • typedef struct
  • short int row
  • short int col
  • short int dir
  • element
  • element stackMAX_STACK_SIZE
  • bound for the stack size
  • - the stack need have only as many
  • positions as there are zeroes in
  • the maze

37
A Mazing Problem
  • simple maze with a long path
  • - Refer to Program 3.8

38
Evaluation of Expressions
39
Evaluation of Expressions
  • Introduction
  • x a/b-cde-ac
  • to understand the meaning of a
  • expressions and statements,
  • - figure out the order in which the
  • operations are performed
  • operator precedence hierarchy
  • - determine the order to evaluate
  • operators
  • associativity
  • - how to evaluate operators with the
  • same precedence

40
Evaluation of Expressions
  • precedence hierarchy for C language

41
Evaluation of Expressions
  • by human
  • 1)assign to each operator a priority
  • 2)use parenthesis and evaluate
  • inner-most ones
  • (((a(bc))(d/e))-(a/(cd)))
  • by compiler
  • - by reworking to postfix form
  • 1) translation (infix to postfix)
  • 2) evaluation (postfix)
  • infix form opnd (optr) opnd
  • postfix form opnd opnd (optr)

42
Evaluation of Expressions
  • infix and postfix notation
  • evaluation of postfix expression
  • - scan left-to-right
  • - place the operands on a stack
  • until an operator is found
  • - perform operations

43
Evaluating Postfix Expression
  • 6 2/-4 2
  • postfix evaluation

44
Evaluating Postfix Expression
  • get_token()
  • - used to obtain tokens from the
  • expression string
  • eval()
  • - if the token is operand, convert
  • it to number and push to the stack
  • - otherwise
  • 1) pop two operands from the stack
  • 2) perform the specified operation
  • 3) push the result back on the
  • stack

45
Evaluation of Expressions
  • define MAX_STACK_SIZE 100
  • / maximum stack size /
  • define MAX_EXPR_SIZE 100
  • / max size of expression /
  • typedef enum lparen, rparen, plus, minus, times,
    divide, mode, eos, operand
  • precedence
  • int stackMAX_STACK_SIZE / global stack /
  • char exprMAX_EXPR_SIZE / input string /
  • represent stack by a global array
  • - accessed only through top
  • - assume only the binay operator
  • ,-,,/, and
  • - asuume single digit integer

46
Evaluation of Expressions
  • function to evaluate a postfix expression
  • int eval()
  • precedence token
  • char symbol
  • int op1, op2
  • int n 0
  • int top -1
  • token get_token(symbol, n)
  • while (token ! eos)
  • if (token operand)
  • push(top, symbol-0)
  • else
  • op2 pop(top)
  • op1 pop(top)
  • switch (token)
  • case plus push(top, op1op2)
    break
  • case minus push(top, op1-op2)
    break

47
Evaluation of Expressions
  • function to get a token
  • precedence get_token(char psymbol, int pn)
  • psymbol expr(pn)
  • switch (psymbol)
  • case ( return lparen
  • case ) return rparen
  • case return plus
  • case - return minus
  • case return times
  • case / return divide
  • case return mod
  • case return eos
  • default return operand / no error
    checking /

48
Evaluating Postfix Expression
  • Complexity
  • - time O(n) where
  • n number of symbols in expression
  • - space stack exprMAX_EXPR_SIZE

49
Infix to Postfix
  • algorithm for producing a postfix
  • expression from an infix one
  • 1) fully parenthesize the expression
  • 2) move all binary operators so that
  • they replace their corresponding
  • right parentheses
  • 3) delete all parentheses
  • eg) a/b-cde-ac
  • é ((((a/b)-c)(de))-ac))
  • é ab/c-deac-
  • - requires two pass

50
Infix to Postfix
  • form a postfix in one pass
  • - order of operands is the same in
  • infix and postfix
  • - order of operators depends on
  • precedence
  • - we can use stack
  • Ex 3.3 simple expression
  • simple expression abc
  • - yield abc in postfix

51
Infix to Postfix
  • - output operator with higher
  • precedence before those with lower
  • precedence
  • translation of abc to postfix

52
Infix to Postfix
  • Ex 3.4 parenthesized expression
  • parentheses make the translation
  • process more difficult
  • - equivalent postfix expression is
  • parenthesis-free
  • expression a(bc)d
  • - yield abcd in postfix
  • right parenthesis
  • - pop operators from a stack until
  • left parenthesis is reached

53
Infix to Postfix
  • translation of a(bc)d to postfix

54
Infix to Postfix
  • a precedence-based scheme for
  • stacking and unstacking operators
  • ispstacktop lt icptoken
  • - push
  • ispstacktop ³ icptoken
  • - pop and print

in-stack precedence
incoming precedence
55
Infix to Postfix
  • Use two types of precedence
  • (because of the ( operator)
  • - in-stack precedence(isp)
  • - incoming precedence(icp)
  • precedence stackMAX_STACK_SIZE
  • / isp and icp arrays -- index is value of
  • precedence lparen, rparen, plus, minus,
  • times, divide, mode, eos /
  • static int isp 0,19,12,12,13,13,13,0
  • static int icp 20,19,12,12,13,13,13,0

56
Infix to Postfix
  • void postfix(void)
  • char symbol
  • precedence token
  • int n 0
  • int top 0
  • stack0 eos
  • for (token get_token(symbol, n) token !
    eos token get_token(symbol, n))
  • if (token operand)
  • printf(c, symbol)
  • else if (token rparen)
  • while (stacktop ! lparen)
  • print_token(pop(top))
  • pop(top)
  • else
  • while (ispstacktop gt icptoken)
  • print_token(pop(top))
  • push(top, token)

function to convert from infix to postfix
57
Infix to Postfix
  • postfix
  • - no parenthesis is needed
  • - no precedence is needed
  • complexity
  • - time O(r) where
  • r number of symbols in expression
  • - space S(n) n where
  • n number of operators

58
Multiple Stacks and Queues
59
Multiple Stacks and Queues
  • multiple stacks
  • we need n stacks simultaneously
  • - maximum size of each stack is
  • unpredictable
  • - size of each stack is dynamically
  • varying
  • - efficient memory utilization for
  • multiple stacks is difficult

60
Multiple Stacks and Queues
  • sequential mappings of stacks into
  • an array
  • - memoryMEM_SIZE
  • case n 2
  • the first stack
  • - bottom element memory0
  • - grow toward memoryMEM_SIZE-1
  • the second stack
  • - bottom element memoryMEM_SIZE-1
  • - grow toward memory0

61
Multiple Stacks and Queues
  • top0 -1 stack 1 is empty
  • top1 m stack 2 is empty

62
Multiple Stacks and Queues
  • case n ³ 3
  • - boundary
  • point to the position immediately
  • to the left of the bottom element
  • - top
  • point to the top element
  • define MEM_SIZE 100
  • define MAX_STACKS 10
  • element memoryMEM_SIZE
  • int topMAX_STACKS
  • int boundaryMAX_STACKS
  • int n / number of stacks, n lt MAX_STACKS /

63
Multiple Stacks and Queues
  • divide the array into roughly equal
  • segments
  • top0 boundary0 -1
  • for(i 1i lt n i)
  • topi boundaryi (MEM_SIZE/n)i - 1
  • boundaryn MEM_SIZE - 1
  • initial configuration for n stacks
  • in memorym

0
1
m/n
2 m/n
m-1
boundaryn
64
Multiple Stacks and Queues
  • initially
  • boundaryi topi m/n i - 1
  • i-th stack is empty
  • - topi boundaryi
  • i-th stack is full
  • - topi boundaryi1

65
Multiple Stacks and Queues
  • void push(int i, element item)
  • / add an item to the i-th stack /
  • if (topi boundaryi1)
  • stack_full(i)
  • memorytopi item
  • push an item to the i-th stack
  • element pop(int i)
  • / remove top element from the i-th stack /
  • if (topi boundaryi)
  • return stack_empty(i)
  • return memorytopi--
  • pop an item from the i-th stack

66
Multiple Stacks and Queues
  • Ex) n 5, m 20, push(1, x)

67
Multiple Stacks and Queues
  • 1)find the least j for i lt j lt n
  • such that there is a free space
  • between stacks j and (j1)
  • - i.e.) tj lt bj1
  • - move stack i1, i2, ,j one
  • position to the right creating a
  • space between stacks i and (i1)
  • 2)if there is no such a j, then look
  • up the left direction
  • - data movement O(m)
Write a Comment
User Comments (0)
About PowerShow.com