Postfix notation represents a algebraic expression.
These are evaluated faster than infix notation, as ( ) are not required.
Algorithm - using Stack
- For each element in postfix string
- if element is an operand
- push element into Stack => Operand
- else // Operator
- Pop from Stack => Operand 1
- Pop from Stack => Operand 2
- Evaluate value using both operands and element (Operator) => value
- Push the value to Stack
- Pop the element of Stack => Final result
Example
String postfix = "2
3 1 * + 9 -"
| 
element | 
oprnd1 | 
oprnd2 | 
value | 
stack | 
| 
2 |  |  |  | 
2 | 
| 
3 |  |  |  | 
2,3 | 
| 
1 |  |  |  | 
2,3,1 | 
| 
* | 
3 | 
1 | 
3*1 | 
2,3 | 
| 
+ | 
3 | 
2 | 
3+2 | 
5 | 
| 
9 |  |  |  | 
5,9 | 
| 
- | 
5 | 
9 | 
5-9 | 
-4 | 
Java code
public static int evaluatePostfix(String postfixStr) {
String[] postfixArr = postfixStr.split("");
Stack<Integer> stack = new Stack<Integer>();
for(String element : postfixArr) {
boolean isOperator = isOperator(element);
if(isOperator) {
int value1 = stack.pop();
         int value2 = stack.pop();
int value = calculate(value2, value1, element);
stack.push(value);
else {
stack.push(Integer.valueOf(element));
}
  }int value = calculate(value2, value1, element);
stack.push(value);
else {
stack.push(Integer.valueOf(element));
}
return stack.pop();
}
private static int calculate(int a, int b, String operator){
int result = 0;
if("+".equals(operator)) {
result = (a+b);
else if("-".equals(operator)) {
result = (a-b);
  else if("*".equals(operator)) {
result = (a*b);
result = (a*b);
  else if("/".equals(operator)) {
result = (a/b);
result = (a/b);
return result;
private static boolean isOperator(String element) {
if("+".equals(element) || "-".equals(element)
|| "/".equals(element) || "*".equals(element)) {
return true;
}
return false;
}
 
 
No comments:
Post a Comment
Note: only a member of this blog may post a comment.