In expression evaluation problem, we have given a string s of length n representing an expression that may consist of integers, balanced parentheses, and binary operations ( +, -, *, / ). Evaluate the expression. An expression can be in any one of prefix, infix, or postfix notation.
Table of Contents
Example
See few examples for expression evaluation:
Input : s = “100 * ( 2 + 12 )”
Output : 1400
Input : s = “10 + 2 * 6”
Output : 22
Algorithm for Expression Evaluation
Now we know the problem statement for expression evaluation. So, without wasting our time we move towards algorithm uses for the solution of expression evaluation.
- Initialize a string s of length n consisting of expression.
- Create one stack to store values and other to store operators.
- Traverse through the string and check if the current character is a white space continue the loop. Else if it is an opening parenthesis push it in a stack of operators.
- Else if the current character is a digit. Initialize a integer val as 0. Traverse from the current position + 1 till the end of the string while the current character is a digit and update the val as val * 10 + current digit. Push it in the stack of values.
- Else if it is a closing parenthesis, traverse while the stack of operators is not empty and current character in it is not an opening parenthesis.
- Pop the top 2 digits from the stack of values and an operator from operator stack. Perform the arithmetic operation and push the result in a stack of values.
- While the operator’s stack is not empty, pop the top 2 digits from the stack of values and an operator from operator stack. Perform the arithmetic operation and push the result in a stack of values.
- Return the top of the stack of values.
C++ Program for Expression Evaluation
#include <bits/stdc++.h> using namespace std; int precedence(char op){ if(op == '+'||op == '-') return 1; if(op == '*'||op == '/') return 2; return 0; } int applyOp(int a, int b, char op){ switch(op){ case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } } int evaluate(string tokens){ int i; stack <int> values; stack <char> ops; for(i = 0; i < tokens.length(); i++){ if(tokens[i] == ' ') continue; else if(tokens[i] == '('){ ops.push(tokens[i]); } else if(isdigit(tokens[i])){ int val = 0; while(i < tokens.length() && isdigit(tokens[i])){ val = (val*10) + (tokens[i]-'0'); i++; } values.push(val); } else if(tokens[i] == ')'){ while(!ops.empty() && ops.top() != '('){ int val2 = values.top(); values.pop(); int val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } if(!ops.empty()) ops.pop(); } else{ while(!ops.empty() && precedence(ops.top()) >= precedence(tokens[i])){ int val2 = values.top(); values.pop(); int val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } ops.push(tokens[i]); } } while(!ops.empty()){ int val2 = values.top(); values.pop(); int val1 = values.top(); values.pop(); char op = ops.top(); ops.pop(); values.push(applyOp(val1, val2, op)); } return values.top(); } int main(){ cout << evaluate("100 * ( 2 + 12 )") << endl; return 0; }
1400
Java Program for Expression Evaluation
import java.util.Stack; class EvaluateString{ public static int evaluate(String expression){ char[] tokens = expression.toCharArray(); Stack<Integer> values = new Stack<Integer>(); Stack<Character> ops = new Stack<Character>(); for (int i = 0; i < tokens.length; i++){ if(tokens[i] == ' ') continue; if(tokens[i] >= '0' && tokens[i] <= '9'){ StringBuffer sbuf = new StringBuffer(); while(i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9'){ sbuf.append(tokens[i++]); } values.push(Integer.parseInt(sbuf.toString())); } else if(tokens[i] == '(') ops.push(tokens[i]); else if(tokens[i] == ')'){ while (ops.peek() != '('){ values.push(applyOp(ops.pop(), values.pop(), values.pop())); } ops.pop(); } else if(tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/'){ while (!ops.empty() && hasPrecedence(tokens[i], ops.peek())){ values.push(applyOp(ops.pop(), values.pop(), values.pop())); } ops.push(tokens[i]); } } while(!ops.empty()){ values.push(applyOp(ops.pop(), values.pop(), values.pop())); } return values.pop(); } public static boolean hasPrecedence(char op1, char op2){ if (op2 == '(' || op2 == ')') return false; if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) return false; else return true; } public static int applyOp(char op, int b, int a){ switch (op){ case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if (b == 0) throw new UnsupportedOperationException("Cannot divide by zero"); return a / b; } return 0; } public static void main(String[] args){ System.out.println(EvaluateString.evaluate("100 * ( 2 + 12 )")); } }
1400
Complexity Analysis
Time Complexity: O(n) where n is the length of the expression which we going for evaluation.
Space Complexity: O(n) as it is the space required to store the n characters.