computer notes - Evaluating postfix expressions


Published on

Published in: Technology
1 Comment
  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

computer notes - Evaluating postfix expressions

  1. 1. Data Structures Lecture No. 07___________________________________________________________________Data StructuresLecture No. 07Evaluating postfix expressionsIn the previous lecture, we talked about infix and postfix expression and tried tounderstand how to write the postfix notation of mathematical expressions. Aprogrammer can write the operators either after the operands i.e. postfix notation orbefore the operands i.e. prefix notation. Some of the examples are as under: Infix Postfix A+B AB+ 12 + 60 23 12 60 + 23 (A + B)*(C D ) AB+CD * A ↑ B * C D + E/F A B ↑ C*D E F/+The last expression seems a bit confusing but may prove simple by following the rulesin letter and spirit. In the postfix form, parentheses are not used. Consider the infixexpressions as 4+3*5 and (4+3)*5 . The parentheses are not needed in the first butare necessary in the second expression. The postfix forms are: 4+3*5 435*+ (4+3)*5 43+5*In case of not using the parenthesis in the infix form, you have to see the precedencerule before evaluating the expression. In the above example, if we want to add firstthen we have to use the parenthesis. In the postfix form, we do not need to useparenthesis. The position of operators and operands in the expression makes it clear inwhich order we have to do the multiplication and addition.Now we will see how the infix expression can be evaluated. Suppose we have a postfixexpression. How can we evaluate it? Each operator in a postfix expression refers to theprevious two operands. As the operators are binary (we are not talking about unaryoperators here), so two operands are needed for each operator. The nature of theseoperators is not affected in the postfix form i.e. the plus operator (+) will apply on twooperands. Each time we read an operand, we will push it on the stack. We are going toevaluate the postfix expression with the help of stack. After reaching an operator, wepop the two operands from the top of the stack, apply the operator and push the resultback on the stack. Now we will see an example to comprehend the working of stackfor the evaluation of the postfix form. Here is the algorithm in pseudo code form. Afterreading this code, you will understand the algorithm. Stack s; // declare a stack while( not end of input ) { // not end of postfix expression Page 1 of 8
  2. 2. Data Structures Lecture No. 07___________________________________________________________________ e = get next element of input if( e is an operand ) s.push( e ); else { op2 = s.pop(); op1 = s.pop(); value = result of applying operator e to op1 and op2; s.push( value ); } } finalresult = s.pop();We have declared a Stack s . There is a while loop along with not end of inputcondition. Here the input is our postfix expression. You can get the expression fromthe keyboard and use the enter key to finish the expression. In the next statement, weget the next element and store it in e . This element can be operator or operand. Theoperand needs not to be single digit. It may be of two digits or even more like 60 or234 etc. The complete number is stored in the e . Then we have an if statement tocheck whether e is an operand or not. If e is an operand than we wrote s.push(e)i.e. we pushed the e onto the stack. If e is not the operand, it may be an operator.Therefore we will pop the two elements and apply that operator. We pop the stack andstore the operand in op2 . We pop the stack again and store the element in op1 .Then the operator in e is applied to op1 and op2 before storing the result in value.In the end, we push the value on the stack. After exiting the loop, a programmer mayhave only one element in the stack. We pop this element which is the final result.Consider the example of 4+3*2 having a postfix form of 432*+. Here 4, 3, and 2 areoperands whereas + and * are operators. We will push the numbers 4, 3 and 2 on thestack before getting the operator *. Two operands will be popped from the stack and *is being applied on these. As stack is a LIFO structure, so we get 2 first and then 3 as aresult of pop. So 2 is store in op1 and 3 in op2 . Let s have a look on the programagain. On applying * on these, we will push the result (i.e. 6) on the stack. The whileloop will be executed again. In case of getting the next input as operand, we will pushit on the stack otherwise we will pop the two operands and apply the operator onthese. Here the next element is the operator +. So two operands will be popped fromthe stack i.e. 6 and 4. We will apply the operator plus on these and push the result (i.e.10) on the stack. The input is finished. Now we will pop the stack to get the final resulti.e. 10.An ExampleIn the earlier example, we have used the stack to solve the postfix expression. Let ssee another comprehensive example. The postfix expression is: 623+-382/+*2↑3+We want to evaluate this long expression using stack. Let s try to solve it on paper.We have five columns here i.e. input, op1, op2, value and stack. We will run our Page 2 of 8
  3. 3. Data Structures Lecture No. 07___________________________________________________________________pseudo code program. In the start, we read the input as a result we get number 6. As 6is operand, so it will be pushed on the stack. Then we have number 2 which will alsobe pushed on the stack. Now 2 is the most recent element. The next element is thenumber 3 that will also be pushed on the stack. Now, there are three elements on thestack i.e. 3, 2 and 6. The number 3 is the most recent. On popping, we will get thenumber 3 first of all. The next element is + , an operator. Now the else part of ourpseudo code is executed. We will pop two operands from the stack and apply theoperator (+) on these. The number 3 will be stored in variable op2 and number 2 inop1. The operator (+) will be applied on these i.e. 2+3 and the result is stored in value.Now we will push the value (i.e. 5) on the stack. Now we have two numbers on thestack i.e. 5 and 6. The number 5 is the most recent element. The next element is - . Asit is also an operator, so we will pop the two elements from the stack i.e. 5 and 6. Nowwe have 5 in op2 and 6 in op1. On applying the operator (-), we will get the result as 1(6-5). We can t say op2 - op1. The result (1) will be pushed on stack. Now on thestack, we have only one element i.e. 1. Next three elements are operands so we pushed3, 8 and 2 on the stack. The most recent element is 2. The next input is an operator inthe expression i.e. / , we will pop two elements from the stack. The number 2 will bestored in op2 while number 8 in op1. We apply the operator (/) on the op1 and op2 i.e.(op1/op2), the result is 4 (i.e. 8/2). We push the result on the stack. We have, now,three elements i.e. 4, 3, and 1 on the stack. The next element is operator plus (+). Wewill pop the two elements i.e. 4 and 3 and will apply the operator (+). The result (7)will be pushed on the stack. The next input element is operator multiply (*). We willpop the two elements i.e. 7 and 1 and the result (7*1 = 7) is pushed on the stack. Youhave noted that whenever we have an operator in the input expression, we have two ormore elements on the stack. As the operators we are using are binary and we need twooperands for them. It will never be the case that you want to pop two elements fromthe stack and there is only one or no element on the stack. If this happens than it meansthere is an error in the program and you have popped more values than required. Thenext input element is 2 that is pushed on the stack. We have, now, the operator ( ↑ ) inthe input. So we will pop the two elements, op2 will hold 2 and op1 will have thenumber 7. The operator ( ↑ ) will be applied on the operands i.e. (7 ↑ 2) and the result(49) is pushed on the stack. We have, now, the number 3 in the element being pushedon the stack. The last element is the operator plus (+). So we pop the two elements i.e.49 and 2 and apply the operator on these. The result (49+3 = 52) is pushed on thestack. The input expression is finished, resulting in the final result i.e. 52.This the tabular form of the evaluation of the postfix expression. Input op1 op2 value stack 6 6 2 2 6 3 3 2 6 + 2 3 5 5 6 - 6 5 1 1 Page 3 of 8
  4. 4. Data Structures Lecture No. 07___________________________________________________________________ 3 6 5 1 3 1 8 6 5 1 8 3 1 2 6 5 1 2 8 3 1 / 8 2 4 4 3 1 + 3 4 7 7 1 * 1 7 7 7 2 1 7 7 2 7 ↑ 7 2 49 49 3 7 2 49 3 49 + 49 3 52 52With the help of stack we can easily solve a very big postfix expression. Suppose youwant to make a calculator that is a part of some application e.g. some spreadsheetprogram. This calculator will be used to evaluate expressions. You may want tocalculate the value of a cell after evaluating different cells. Evaluation of the infix formprogrammatically is difficult but it can be done. We will see another data structurewhich being used to solve the expressions in infix form. Currently, we have to evaluatethe values in different cells and put this value in another cell. How can we do that? Wewill make the postfix form of the expression associated with that cell. Then we canapply the above algorithm to solve the postfix expression and the final result will beplaced at that cell. This is one of the usages of the stack.Infix to postfix ConversionWe have seen how to evaluate the postfix expressions while using the stack. How canwe convert the infix expression into postfix form? Consider the example of aspreadsheet. We have to evaluate expressions. The users of this spreadsheet willemploy the infix form of expressions. Consider the infix expressions A+B*C and (A+B)*C . The postfix versions are ABC*+ and AB+C* respectively. The order ofoperands in postfix is the same as that in the infix. In both the infix expressions, wehave the order of operands as A, B and then C. In the postfix expressions too, theorder is the same i.e. A, B, followed by C. The order of operands is not changed inpostfix form. However, the order of operators may be changed. In the first expression A+B*C , the postfix expression is ABC*+ . In the postfix form multiplication comesbefore the plus operator. In scanning from left to right, the operand A can be insertedinto postfix expression. First rule of algorithm is that if we find the operand in the infixform, put it in the postfix form. The rules for operators are different. The + cannot beinserted in the postfix expression until its second operand has been scanned and Page 4 of 8
  5. 5. Data Structures Lecture No. 07___________________________________________________________________inserted. Keep the expression A+B*C in your mind. What is the second operand of theplus? The first operand is A and the second operand is the result of B*C. The + hasto wait until the * has not been performed. You do the same thing while using thecalculator. First you will multiply the B*C and then add A into the result. The + hasto be stored away until its proper position is found. When B is seen, it is immediatelyinserted into the postfix expression. As B is the operand, we will send the operand tothe postfix form. Can the + be inserted now? In case of A+B*C , we cannot insert + because * has precedence. To perform multiplication, we need the secondoperand. The first operand of multiplication is B while the second one is C . So atfirst, we will perform the multiplication before adding result to A .In case of (A+B)*C , the closing parenthesis indicates that + must be performedfirst. After sending the A and B to postfix perform, we can perform the addition due tothe presence of the parenthesis. Then C will be sent to the postfix expression. It will befollowed by the multiplication of the C and the result of A + B. The postfix form ofthis expression is AB+C*. Sometimes, we have two operators and need to decidewhich to apply first like in this case + and * . In this case, we have to see whichoperator has higher precedence. Assume that we have a function prcd(op1,op2)where op1 and op2 are two operators. The function prcd(op1,op2) will return TRUEif op1 has precedence over op2, FASLE otherwise. Suppose we call this function withthe arguments * and + i.e. prcd(*, +), it will return true. It will also return true incase both op1 and op2 are + e.g. if we have A+B+C, then it does not matter which +we perform first. The call prcd(+ , *) will return false as the precedence of * is higherthan the + operator. The + has to wait until * is performed.Now we will try to form an algorithm to convert infix form into postfix form. For thispurpose, a pseudo code will be written. We will also write the loops and if conditions.The pseudo code is independent of languages. We will be using a stack in thisalgorithm. Here, the infix expression is in the form of a string. The algorithm is asfollows: Stack s; while( not end of input ) { c = next input character; if( c is an operand ) add c to postfix string; else { while( !s.empty() && prcd(,c) ){ op = s.pop(); add op to the postfix string; } s.push( c ); } while( !s.empty() ) { op = s.pop(); add op to postfix string; }First we will declare a stack s . The while loop will continue till the end of input. We Page 5 of 8
  6. 6. Data Structures Lecture No. 07___________________________________________________________________read the input character and store it in the c . Here the input character does not meanone character, but an operand or an operator. Then we have a conditional if statement.If c is an operand, then we will have to add it to postfix string. Whenever we get anoperand in the infix form, it will be added to the postfix form. The order of operandsdoes not change in the conversion. However, in this case, the order of operators maychange. If c is the operator, then we will, at first, check that stack is not emptybesides identifying the precedence of the operators between the input operator and theoperator that is at the top of the stack. In case of the precedence of the operator that ison the stack is higher, we will pop it from the stack and send to the postfix string. Forexample if we have * on the stack and the new input operator is +. As the precedenceof the + operator is less than the * operator, the operands of the multiplication hasalready been sent to the postfix expression. Now, we should send the * operator to thepostfix form. The plus operator (+) will wait. When the while loop sends all suchoperators to the postfix string, it will push the new operator to the stack that is in c .It has to wait till we get the second operand. Then we will again get the input. On thecompletion of the input, the while loop will be finished. There may be a case that inputmay be completed even at the time when there are still some elements on the stack.These are operators. To check this, we have another while loop. This loop checks ifthe stack is not empty, pops the operator and put it in the postfix string. Let s take alook at a comprehensive example to understand it. In case of the infix expression, A +B * C, we have three columns, one each for input symbol, the postfix expression andthe stack respectively. Now let s execute the pseudo code. First of all, we get the Aas input. It is an operand so we put it on the postfix string. The next input is the plusoperator (+) which will be pushed on the stack. As it is an operator and we need twooperands for it. On having a look at the expression, you might have figure out that thesecond operand for the plus operator is B*C. The next input is the operand B beingsent to the postfix expression form. The next thing we get is the input element as * .We know that the precedence of * is higher than that of the +. Let s see how we cando that according to our pseudo code. The prcd(, op) takes two operands. Wewill get the top element of the stack i.e. + will be used as first argument. The secondargument is the input operator i.e. *. So the function call will be as prcd(+, *) whilethe function returns false because the precedence of the plus operator is not higherthan the multiplication operator. So far, we have only one operand for multiplicationi.e. B. As multiplication is also a binary operator, it will also have to wait for thesecond operand. It has to wait and the waiting room is stack. So we will push it on thestack. Now the top element of the stack is *. The next symbol is C . Being anoperand, C will be added to the postfix expression. At this point, our input expressionhas been completed. Our first while loop executes till the end of input. After the endof the input, the loop will be terminated. Now the control goes to the second whileloop which says if there is something on the stack, pop it and add it the postfixexpression. In this case, we have * and + on the stack. The * is at the top of the stack.So when we pop, we get * which is at the top of the stack and it will be added to thepostfix expression. In the result of second pop, we get the plus operator (+) which isalso added to the postfix expression. The stack is empty now. The while loop will beterminated and postfix expression is formed i.e. ABC*+. Symbol postfix stack A A + A + Page 6 of 8
  7. 7. Data Structures Lecture No. 07___________________________________________________________________ B AB + * AB * + C ABC * + ABC* + ABC*+If we have to convert the infix expression into the postfix form, the job is easily donewith the help of stack. The above algorithm can easily be written in C++ or Clanguage, specially, if you already have the stack class. Now you can convert very biginfix expressions into postfix expressions. Why we have done this? This can beunderstood with the help of the example of spreadsheet programming where the valueof cell is the evaluation of some expression. The user of the spreadsheets will use theinfix expressions as they are used to it.Sometimes we do need the parenthesis in the infix form. We have to evaluate the lowerprecedence operator before the higher precedence operator. If we have the expression(A+B) *C, this means that we have to evaluate + before the multiplication. Theobjective of using parenthesis is to establish precedence. It forces to evaluate theexpression first of all. We also have to handle parenthesis while converting the infixexpression into postfix one. When an open parenthesis ( is read, it must be pushed onthe stack. This can be done by setting prcd(op, ( ) to be FALSE. What is the reasonto put the parenthesis on the stack? It is due to the fact that as long as the closingparenthesis is not found, the open parenthesis has to wait. It is not a unary or binaryoperator. Actually, it is a way to show or write precedence. We can handle theparenthesis by adding some extra functionality in our prcd function. When we callprcd(op, ( ), it will return false for all the operators and be pushed on the stack. Also,prcd( ( ,op ) is FALSE which ensures that an operator after ( is pushed on the stack.When a ) is read. All operators up to the first ( must be popped and placed in thepostfix string. To achieve this our function prcd( op, ) ) should return true for all theoperators. Both the ( and the ) will not go to the postfix expression. In postfixexpression, we do not need parenthesis. The precedence of the operators is establishedin such a way that there is no need of the parenthesis. To include the handling ofparenthesis, we have to change our algorithm. We have to change the line s.push(c) to: if( s.empty() || symb != ) ) s.push( c ); else s.pop(); // discard the (If the input symbol is not ) and the stack is not empty, we will push the operator onthe stack. Otherwise, it is advisable to pop the stack and discard the ( . The followingfunctionality has to be added in the prcd function. prcd( ( , op ) = FALSE for any operator prcd( op, ) ) = FALSE for any operator other than ) prcd( op, ) ) = TRUE for any operator other than ( prcd( ) , op ) = error for any operator. Page 7 of 8
  8. 8. Data Structures Lecture No. 07___________________________________________________________________In the next lecture we will see in detail an example regarding the use of parenthesis. Page 8 of 8