In: Computer Science
Write the code for postfix expression in C++ using a linked stack that can take numbers bigger than 9 (any size the user gives) and pushes the final result onto the top of the stack
This is a updated code capable of taking integers greater than 9 (any size that user gives) for postfix expression evaluation
#include<iostream>
#include<stack>
#include<string>
#include<cmath>
using namespace std;
// Function to verify whether a character is numeric digit.
bool IsNumericDigit(char C)
{
if(C >= '0' && C <= '9') return true;
return false;
}
// Function to verify whether a character is operator symbol or not.
bool IsOperator(char C)
{
if(C == '+' || C == '-' || C == '*' || C == '/' || C == '^')
return true;
return false;
}
// Function to perform an operation and return output.
int PerformOperation(char operation, int operand1, int operand2)
{
if(operation == '+') return (operand1 + operand2);
else if(operation == '-') return (operand1 - operand2);
else if(operation == '*') return (operand1 * operand2);
else if(operation == '/') return (operand1 / operand2);
// Using typecasting for integer result for pow() function
// The pow() function takes ‘double’ as the arguments and returns a ‘double’ value.
// This function does not always work for integers. One such example is pow(5, 2).
// When assigned to an integer, it outputs 24 on some compilers and works fine for some other compilers.
// But pow(5, 2) without any assignment to an integer outputs 25.
// To overcome this and output the accurate answer in integer format,
// we can add 0.5 to the result and typecast it to int e.g (int)(pow(5, 2)+0.5) will give
// the correct answer(25, in above example), irrespective of the compiler.
else if(operation == '^') return ( (int)(pow(operand1, operand2) + 0.5) );
else cout<<"Unexpected Error \n";
return -1;
}
// Function to evaluate Postfix expression and return output
int EvaluatePostfix(string expression)
{
// Declaring a Stack from Standard template library in C++.
stack<int> S;
for(int i = 0;i< expression.length();i++) {
// Scanning each character from left.
// If character is a delimitter, move on.
if(expression[i] == ' ' || expression[i] == ',') continue;
// If character is operator, pop two elements from stack, perform operation and push the result back.
else if(IsOperator(expression[i])) {
// Pop two operands.
int operand2 = S.top(); S.pop();
int operand1 = S.top(); S.pop();
// Perform operation
int result = PerformOperation(expression[i], operand1, operand2);
//Push back result of operation on stack.
S.push(result);
}
else if(IsNumericDigit(expression[i])){
// Extract the numeric operand from the string
// Keep incrementing i as long as you are getting a numeric digit.
int operand = 0;
while(i<expression.length() && IsNumericDigit(expression[i])) {
// For a number with more than one digits, as we are scanning from left to right.
// Everytime , we get a digit towards right, we can multiply current total in operand by 10
// and add the new digit.
operand = (operand*10) + (expression[i] - '0');
i++;
}
// Finally, you will come out of while loop with i set to a non-numeric character or end of string
// decrement i because it will be incremented in increment section of loop once again.
// We do not want to skip the non-numeric character by incrementing i twice.
i--;
// Push operand on stack.
S.push(operand);
}
}
// If expression is in correct format, Stack will finally have one element. This will be the output.
return S.top();
}
int main()
{
string expression;
cout<<"Important instruction to be followed\n\nEvaluation Of postfix Expression in C++\nInput Postfix expression must be in a desired format.\nOperands must be integers and there should be space in between two operands.\nOnly '+' , '-' , '*' , '/' and '^' operators are expected.";
cout<<"\n\n\n\nEnter Postfix Expression: ";
getline(cin,expression);
int result = EvaluatePostfix(expression);
cout<<"\n\nOutput = "<<result<<"\n";
return 0;
}
Output
screenshot