Evaluate the Value of an Arithmetic Expression in Reverse Polish Notation in Java
Last Updated :
23 Mar, 2023
Reverse Polish ‘Notation is postfix notation which in terms of mathematical notion signifies operators following operands. Let’s take a problem statement to implement RPN
Problem Statement: The task is to find the value of the arithmetic expression present in the array using valid operators like +, -, *, /. Each operand may be an integer or another expression.
Note:
- The division between two integers should truncate toward zero.
- The given RPN expression is always valid. That means the expression would always evaluate to a result and there won’t be any divide by zero operation.
Layman Working of RPN as shown
Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9
Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6
Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
Output: 22
Explanation:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
Approach:
The basic approach for the problem is using the stack.
- Accessing all elements in the array, if the element is not matching with the special character (‘+’, ‘-‘,’*’, ‘/’) then push the element to the stack.
- Then whenever the special character is found then pop the first two-element from the stack and perform the action and then push the element to stack again.
- Repeat the above two process to all elements in the array
- At last pop the element from the stack and print the Result
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int eval(vector<string>& A)
{
stack< int > st;
for ( int i = 0; i < A.size(); i++) {
if (A[i] != "+" && A[i] != "-" && A[i] != "/"
&& A[i] != "*" ) {
st.push(stoi(A[i]));
continue ;
}
else {
int b = st.top();
st.pop();
int a = st.top();
st.pop();
if (A[i] == "+" )
st.push(a + b);
else if (A[i] == "-" )
st.push(a - b);
else if (A[i] == "*" )
st.push(a * b);
else
st.push(a / b);
}
}
return st.top();
}
int main()
{
vector<string> A
= { "10" , "6" , "9" , "3" , "+" , "-11" , "*" ,
"/" , "*" , "17" , "+" , "5" , "+" };
int res = eval(A);
cout << res << endl;
}
|
Java
import java.io.*;
import java.util.*;
class solution {
public int stacky(String[] tokens)
{
Stack<String> stack = new Stack<String>();
int x, y;
String result = "" ;
int get = 0 ;
String choice;
int value = 0 ;
String p = "" ;
for ( int i = 0 ; i < tokens.length; i++) {
if (tokens[i] != "+" && tokens[i] != "-"
&& tokens[i] != "*" && tokens[i] != "/" ) {
stack.push(tokens[i]);
continue ;
}
else {
choice = tokens[i];
}
switch (choice) {
case "+" :
x = Integer.parseInt(stack.pop());
y = Integer.parseInt(stack.pop());
value = x + y;
result = p + value;
stack.push(result);
break ;
case "-" :
x = Integer.parseInt(stack.pop());
y = Integer.parseInt(stack.pop());
value = y - x;
result = p + value;
stack.push(result);
break ;
case "*" :
x = Integer.parseInt(stack.pop());
y = Integer.parseInt(stack.pop());
value = x * y;
result = p + value;
stack.push(result);
break ;
case "/" :
x = Integer.parseInt(stack.pop());
y = Integer.parseInt(stack.pop());
value = y / x;
result = p + value;
stack.push(result);
break ;
default :
continue ;
}
}
return Integer.parseInt(stack.pop());
}
}
class GFG {
public static void main(String[] args)
{
String[] s
= { "10" , "6" , "9" , "3" , "+" , "-11" , "*" ,
"/" , "*" , "17" , "+" , "5" , "+" };
solution str = new solution();
int result = str.stacky(s);
System.out.println(result);
}
}
|
Python3
def evaluate(expression):
expression = expression.split()
stack = []
for ele in expression:
if ele not in '/*+-' :
stack.append( int (ele))
else :
right = stack.pop()
left = stack.pop()
if ele = = '+' :
stack.append(left + right)
elif ele = = '-' :
stack.append(left - right)
elif ele = = '*' :
stack.append(left * right)
elif ele = = '/' :
stack.append( int (left / right))
return stack.pop()
arr = "10 6 9 3 + -11 * / * 17 + 5 +"
answer = evaluate(arr)
print (f "Value of given expression'{arr}' = {answer}" )
|
C#
using System;
using System.Collections.Generic;
public class GFG {
public class Solution {
public int stacky( string [] tokens)
{
Stack< string > stack = new Stack< string >();
int x, y;
string result = "" ;
string choice;
int value = 0;
string p = "" ;
for ( int i = 0; i < tokens.Length; i++) {
if (tokens[i] != "+" && tokens[i] != "-"
&& tokens[i] != "*"
&& tokens[i] != "/" ) {
stack.Push(tokens[i]);
continue ;
}
else {
choice = tokens[i];
}
switch (choice) {
case "+" :
x = int .Parse(stack.Pop());
y = int .Parse(stack.Pop());
value = x + y;
result = p + value;
stack.Push(result);
break ;
case "-" :
x = int .Parse(stack.Pop());
y = int .Parse(stack.Pop());
value = y - x;
result = p + value;
stack.Push(result);
break ;
case "*" :
x = int .Parse(stack.Pop());
y = int .Parse(stack.Pop());
value = x * y;
result = p + value;
stack.Push(result);
break ;
case "/" :
x = int .Parse(stack.Pop());
y = int .Parse(stack.Pop());
value = y / x;
result = p + value;
stack.Push(result);
break ;
default :
continue ;
}
}
return int .Parse(stack.Pop());
}
}
static public void Main()
{
string [] s
= { "10" , "6" , "9" , "3" , "+" , "-11" , "*" ,
"/" , "*" , "17" , "+" , "5" , "+" };
Solution str = new Solution();
int result = str.stacky(s);
Console.WriteLine(
"Value of given expression'10 6 9 3 + -11 * / * 17 + 5 +' = "
+ result);
}
}
|
Javascript
function eval(A)
{
let st = [];
for (let i = 0; i < A.length; i++)
{
if (A[i] != "+" && A[i] != "-" && A[i] != "/"
&& A[i] != "*" ) {
st.push(parseInt(A[i]));
continue ;
}
else {
let b = parseInt(st.pop());
let a = parseInt(st.pop());
if (A[i] == "+" )
st.push(a + b);
else if (A[i] == "-" )
st.push(a - b);
else if (A[i] == "*" )
st.push(a * b);
else
st.push(parseInt(a / b));
}
}
return parseInt(st[st.length-1]);
}
let A = [ "10" , "6" , "9" , "3" , "+" , "-11" , "*" ,
"/" , "*" , "17" , "+" , "5" , "+" ];
let res = eval(A);
console.log(res);
|
Output
Value of given expression'10 6 9 3 + -11 * / * 17 + 5 +' = 22
Time complexity: O(n)
Auxiliary Space: O(n)
Approach – Space Optimized
Follow the below steps to Implement the idea:
- Create two integer variables i = 0 and lastNum (variable for keeping track of the index of the last number seen) = -1.
- Check if the current element is an arithmetic operator (+, -, *, /), If the current element is an arithmetic operator, then do the following:
a. Convert the previous two elements (the operands) to integers and store them in val1(get the second-to-last number seen) and val2(get the last number seen).
b. Perform the operation based on the operator, update the second-to-last number with the result, update the index of the last number seen.
- if the current element is a number dp the following:
a.Increment the index of the last number seen.
b.Add the number to the next available index in the array.
Java
import java.util.*;
public class Main {
public static int eval(String[] tokens)
{
int i = 0 ;
int lastNum = - 1 ;
while (i < tokens.length) {
if ( "/*+-" .contains(tokens[i])) {
int val1
= Integer.valueOf(tokens[lastNum - 1 ]);
int val2 = Integer.valueOf(tokens[lastNum]);
int ans = 0 ;
if (tokens[i].equals( "*" ))
ans = val1 * val2;
else if (tokens[i].equals( "/" ))
ans = val1 / val2;
else if (tokens[i].equals( "+" ))
ans = val1 + val2;
else if (tokens[i].equals( "-" ))
ans = val1 - val2;
tokens[lastNum - 1 ] = Integer.toString(ans);
lastNum--;
}
else {
lastNum++;
tokens[lastNum] = tokens[i];
}
i++;
}
return Integer.valueOf(
tokens[lastNum]);
}
public static void main(String[] args)
{
String[] tokens
= { "10" , "6" , "9" , "3" , "+" , "-11" , "*" ,
"/" , "*" , "17" , "+" , "5" , "+" };
int res = eval(tokens);
System.out.println(
"Value of given expression '10 6 9 3 + -11 * / * 17 + 5 +' = "
+ res);
}
}
|
Output
Value of given expression '10 6 9 3 + -11 * / * 17 + 5 +' = 22
Time Complexity: O(N)
Space Complexity: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...