39
Infix to Postfix Conversion

Infix to Postfix Conversion - WordPress.comInfix to Postfix Conversion • Stacks are widely used in the design and implementation of compilers. • For example, they are used to convert

  • Upload
    others

  • View
    56

  • Download
    0

Embed Size (px)

Citation preview

Infix to Postfix Conversion

Infix to Postfix Conversion

• Stacks are widely used in the design and implementation of compilers.

• For example, they are used to convert arithmetic expressions from infix notation to postfix notation.

• An infix expression is one in which operators are located between their operands.

• In postfix notation, the operator immediately follows its operands.

Precedence and PriorityToken Operator Precedence1 Associativity

( )

[ ]

-> .

function call

array element

struct or union member

17 left-to-right

-- ++ increment, decrement2 16 left-to-right

-- ++

!

-

- +

& *

sizeof

decrement, increment3

logical not

one’s complement

unary minus or plus

address or indirection

size (in bytes)

15 right-to-left

(type) type cast 14 right-to-left

* / % mutiplicative 13 Left-to-right

+ - binary add or subtract 12 left-to-right

<< >> shift 11 left-to-right

> >=

< <=

relational

10 left-to-right

== != equality 9 left-to-right

& bitwise and 8 left-to-right

^ bitwise exclusive or 7 left-to-right

bitwise or 6 left-to-right

&& logical and 5 left-to-right

logical or 4 left-to-right

?: conditional 3 right-to-left

= += -=

/= *= %=

<<= >>=

&= ^= =

assignment 2 right-to-left

, comma 1 left-to-right

Examples

Infix Postfix

2+3*4

a*b+5

(1+2)*7

a*b/c

(a/(b-c+d))*(e-a)*c

a/b-c+d*e-a*c

234*+

ab*5+

12+7*

ab*c/

abc-d+/ea-*c*

ab/c-de*ac*-

Algorithm

1. Scan the expression from left to right.2. If any operands comes print it simply3. If any operator comes compare the incoming operator with stack

operator. If the incoming operator priority is higher than stackoperator priority push the incoming operator.

4. If the incoming operator has less priority than the operatorinside the stack then go on popping the operator from top of thestack and print them till this condition is true and then push theincoming operator on top of the stack..

5. If both incoming and stack operator priority are equal then popthe stack operator till this condition is true.

6. If the operator is ‘)’ then go on popping the operators from topof the stack and print them till a matching ‘(‘ operator is found.Delete ‘(‘ from top of the stack..

Suppose we want to convert 2*3/(2-1)+5*3 into Postfix form,

So, the Postfix Expression is 23*21-/53*+

2 Empty 2

* * 2

3 * 23

/ / 23*

( /( 23*

2 /( 23*2

- /(- 23*2

1 /(- 23*21

) / 23*21-

+ + 23*21-/

5 + 23*21-/5

3 +* 23*21-/53

Expression Stack Output

* +* 23*21-/53

Empty 23*21-/53*+

13

Postfix Demo: The EquationInfix: (1 + (2 * ((3 + (4 * 5)) * 6)))

Postfix: 1 2 3 4 5 * + 6 * * +

3+1 ( 2 (* ( (+ 4 5* ) *) 6 ) )( )

( 4 5 *)3( +)( *6 )( 2 *) +1( )

3 +1 2 *+4 5 * *6

4 * 5 = 2020 + 3 = 2323 * 6 = 138138 * 2 = 276276 + 1 = 277

= 277

= 277

14

Postfix Demo: The Stack• What is a ‘STACK’?

• At the grocery store, on the canned goods aisle, the cans are STACKED on top of each other.

• Which one do we take to make sure the stack doesn’t fall over?

• How did the store worker put the cans into the stack? Where did he or she place the new can?

• We take the top item and we place new items on the top. So does the computer.

• To evaluate the problem (1 + (2 * ((3 + (4 * 5)) * 6))), the computer uses a stack and postfix notation.

3 +1 2 *+4 5 * *6

15

Postfix Demo: The Evaluation

3 +1 2 *+4 5 * *6

3

+

1

2

*

+

4

5

*

*4 5 = 2020

203 = 2323

6

623 = 138

138

1382 = 276

276

2761 = 277

277

The Stack

The Answer

FPE Infix to Postfix

( ( ( A + B ) * ( C - E ) ) / ( F + G ) )

• stack: <empty>

• output: []

FPE Infix to Postfix

( ( A + B ) * ( C - E ) ) / ( F + G ) )

• stack: (

• output: []

FPE Infix to Postfix

( A + B ) * ( C - E ) ) / ( F + G ) )

• stack: ( (

• output: []

FPE Infix to Postfix

A + B ) * ( C - E ) ) / ( F + G ) )

• stack: ( ( (

• output: []

FPE Infix to Postfix

+ B ) * ( C - E ) ) / ( F + G ) )

• stack: ( ( (

• output: [A]

FPE Infix to Postfix

B ) * ( C - E ) ) / ( F + G ) )

• stack: ( ( ( +

• output: [A]

FPE Infix to Postfix

) * ( C - E ) ) / ( F + G ) )

• stack: ( ( ( +

• output: [A B]

FPE Infix to Postfix

* ( C - E ) ) / ( F + G ) )

• stack: ( (

• output: [A B + ]

FPE Infix to Postfix

( C - E ) ) / ( F + G ) )

• stack: ( ( *

• output: [A B + ]

FPE Infix to Postfix

C - E ) ) / ( F + G ) )

• stack: ( ( * (

• output: [A B + ]

FPE Infix to Postfix

- E ) ) / ( F + G ) )

• stack: ( ( * (

• output: [A B + C ]

FPE Infix to Postfix

E ) ) / ( F + G ) )

• stack: ( ( * ( -

• output: [A B + C ]

FPE Infix to Postfix

) ) / ( F + G ) )

• stack: ( ( * ( -

• output: [A B + C E ]

FPE Infix to Postfix

) / ( F + G ) )

• stack: ( ( *

• output: [A B + C E - ]

FPE Infix to Postfix

/ ( F + G ) )

• stack: (

• output: [A B + C E - * ]

FPE Infix to Postfix

( F + G ) )

• stack: ( /

• output: [A B + C E - * ]

FPE Infix to Postfix

F + G ) )

• stack: ( / (

• output: [A B + C E - * ]

FPE Infix to Postfix

+ G ) )

• stack: ( / (

• output: [A B + C E - * F ]

FPE Infix to Postfix

G ) )

• stack: ( / ( +

• output: [A B + C E - * F ]

FPE Infix to Postfix

) )

• stack: ( / ( +

• output: [A B + C E - * F G ]

FPE Infix to Postfix

)

• stack: ( /

• output: [A B + C E - * F G + ]

FPE Infix to Postfix

• stack: <empty>

• output: [A B + C E - * F G + / ]

• void infix :: convert( ) • { • char opr ;• while ( *s ) {• if ( *s == ' ' || *s == '\t' ) { • s++ ; • continue ; • }• if ( isdigit ( *s ) || isalpha ( *s ) ) • {• while ( isdigit ( *s ) || isalpha ( *s ) )• {• *t = *s ; s++ ; t-- ;• }• } • if ( *s == ')' ) • {• push ( *s ) ; • s++ ; • }• if ( *s == '*' || *s == '+' || *s == '/' || *s == '%' || *s == '-' || *s == '$' )• {• if ( top != -1 ) • { • opr = pop( ) ;• while ( priority ( opr ) > priority ( *s ) )• {• *t = opr ; • t-- ; • opr = pop( ) ;• } • push ( opr ) ;• push ( *s ) ;• }• else • push ( *s ) ;• s++ ; • } • if ( *s == '(' ) • {• opr = pop( ) ;• while ( ( opr ) != ')' )• {• *t = opr ; • t-- ;• opr = pop ( ) ; • }• s++ ; • }• } • while ( top != -1 ) { opr = pop( ) ; *t = opr ; t-- ; } t++ ; } - See more at: http://electrofriends.com/source-codes/software-programs/cpp-programs/cpp-data-structure/c-program-

to-convert-an-expression-from-infix-expression-to-prefix-form/#sthash.eCuEQFN6.dpuf