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;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.