Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Can I get comments added to this code; so that I can understand it better? and a

ID: 3906142 • Letter: C

Question

Can I get comments added to this code; so that I can understand it better? and any other useful comments or information to infrom me of the code specifically.

#include <iostream>

#include <stack>

#include <string>

#include <cstdlib>

using namespace std;

string InfixToPostfix(string expression);

int evaluatePostfix(string exp);

int HasHigherPrecedence(char operator1, char operator2);

// Function to verify whether a character is a operator symbol or not.

bool IsOperator(char C);

// Function to verify whether a character is alphanumeric chanaracter (letter or numeric digit) or not.

bool IsOperand(char C);

int main(int argc, char *argv[])

{

// system("cls");

string expression;

cout << "1.Enter Infix Expression ";

cout << "2.Enter Postfix Expression ";

int n;

cout << "Enter choice:";

cin >> n;

cout<<"Enter expression: ";

cin.ignore();

getline(cin, expression);

if (n == 1){

string postfix = InfixToPostfix(expression);

cout << "Output = " << postfix << " ";

int k = evaluatePostfix(postfix);

cout << "Result: " << evaluatePostfix(postfix) << endl;

}

else if (n == 2){

cout << "Result: " << evaluatePostfix(expression) << endl;

}

// system("PAUSE");

return 0;

}

// Function to evaluate postfix expression and return output

string InfixToPostfix(string expression)

{

// Declaring a stack

stack<char> S;

string postfix = ""; // Initializing postfix as empty string.

for (int i = 0; i < expression.length(); i++)

{

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]))

{

while (!S.empty() && S.top() != '(' && HasHigherPrecedence(S.top(), expression[i]))

{

postfix += S.top();

S.pop();

}

S.push(expression[i]);

}

// Else if character is an operand

else if (IsOperand(expression[i]))

{

postfix += expression[i];

}

else if (expression[i] == '(')

{

S.push(expression[i]);

}

else if (expression[i] == ')')

{

while (!S.empty() && S.top() != '(')

{

postfix += S.top();

S.pop();

}

S.pop();

}

else

{

cout<<"Invalid expression. ";

exit(1);

}

}

while (!S.empty())

{

postfix += S.top();

S.pop();

}

return postfix;

}

bool IsOperand(char C)

{

if (C >= '0' && C <= '9')

return true;

if (C >= 'a' && C <= 'z')

return true;

if (C >= 'A' && C <= 'Z')

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 verify whether an operator is right associative or not.

int IsRightAssociative(char op)

{

if (op == '$')

return true;

return false;

}

int GetOperatorWeight(char op)

{

int weight = -1;

switch (op)

{

case '+':

case '-':

weight = 1;

case '*':

case '/':

weight = 2;

case '$':

weight = 3;

}

return weight;

}

int HasHigherPrecedence(char op1, char op2)

{

int op1Weight = GetOperatorWeight(op1);

int op2Weight = GetOperatorWeight(op2);

if (op1Weight == op2Weight)

{

if (IsRightAssociative(op1))

return false;

else

return true;

}

return op1Weight > op2Weight ? true : false;

}

int evaluatePostfix(string exp)

{

stack<char> S;

int i;

for (i = 0; exp[i]; ++i)

{

if (isdigit(exp[i]))

S.push(exp[i]-'0');

else

{

int val1 = S.top();

S.pop();

int val2 = S.top();

S.pop();

switch (exp[i])

{

case '+': S.push(val2 + val1); break;

case '-': S.push(val2 - val1); break;

case '*': S.push(val2 * val1); break;

case '/': S.push(val2/val1); break;

}

}

}

return S.top();

}

Explanation / Answer

#include<iostream>
#include<stack>
#include<string>

using namespace std;

//Functions Declaration

string InfixToPostfix(string expression); // Function to convert Infix expression to postfix

int HasHigherPrecedence(char operator1, char operator2); // Function to verify whether an operator has higher precedence over other


bool IsOperator(char C);   // Function to verify whether a character is operator or not.


bool IsOperand(char C);   // Function to verify whether a character is alphanumeric character (letter or numeric digit) or not.

int main()
{
   string expression;    //Declaration of an expression as a String
   cout<<"Enter Infix Expression ";
   getline(cin,expression);   //Reading Infix Expression
   string postfix = InfixToPostfix(expression);   //Function Call
   cout<<"Output = "<<postfix<<" ";   //Printing the output
}

// Function to evaluate Postfix expression and return output

string InfixToPostfix(string expression)   //User defined Function Definition
{
   // Declaring a Stack from Standard template library in C++.
   stack<char> S;
   string postfix = "";    // Initialize postfix as empty string.
   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]))
       {
           while(!S.empty() && S.top() != '(' && HasHigherPrecedence(S.top(),expression[i]))
           {
               postfix+= S.top();
               S.pop();
           }
           S.push(expression[i]);
       }
      
// Else if character is an operand add it to the output string i.e., postfix
       else if(IsOperand(expression[i]))
       {
           postfix +=expression[i];
       }

       else if (expression[i] == '(') //if it is a open paranthesis push it on to the stack
       {
           S.push(expression[i]);
       }

       else if(expression[i] == ')') //if it closed parnthesis pop the elements from the stack and add them to the output.
       {
           while(!S.empty() && S.top() != '(') {
               postfix += S.top();
               S.pop();
           }
           S.pop();
       }
   }

   while(!S.empty()) {
       postfix += S.top();
       S.pop();
   }

   return postfix;
}

// Function to verify whether a character is english letter or numeric digit.
// assuming that operand will be a single character

bool IsOperand(char C)
{
   if(C >= '0' && C <= '9') return true;
   if(C >= 'a' && C <= 'z') return true;
   if(C >= 'A' && C <= 'Z') 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 verify whether an operator is right associative or not.

int IsRightAssociative(char op)
{
   if(op == '$') return true;
   return false;
}

// Function to get weight of an operator. An operator with higher weight will have higher precedence.

int GetOperatorWeight(char op)
{
   int weight = -1;
   switch(op)
   {
   case '+':
   case '-':
       weight = 1;
       break;
   case '*':
   case '/':
       weight = 2;
       break;
   case '$':
       weight = 3;
       break;
   }
   return weight;
}

// Function to perform an operation and return output.

int HasHigherPrecedence(char op1, char op2)
{
   int op1Weight = GetOperatorWeight(op1);
   int op2Weight = GetOperatorWeight(op2);

   // If operators have equal precedence, return true if they are left associative.
   // return false, if right associative.
   // if operator is left-associative, left one should be given priority.

   if(op1Weight == op2Weight)
   {
       if(IsRightAssociative(op1)) return false;
       else return true;
   }
   return op1Weight > op2Weight ? true: false;
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote