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

In this assignment you will write a program called \" infix.cpp \", that uses a

ID: 671531 • Letter: I

Question

In this assignment you will write a program called "infix.cpp", that uses a stack, implemented as a singly-linked list, to convert a postfix expression to the corresponding fully-parenthesized infix expression. Consider the following examples:

the postfix expression a b + c d - * will be converted to the infix ((a + b) * (c - d))

the the postfix expression a b + will be converted to the infix (a + b)

the postfix expression a b / c d / / will be converted to infix ((a / b) / (c / d))

for the postfix expression  a b / c * + the program should print the error message "too many operators and not enough operand".

for the postfix expression  a b c d / + e * f   the program should print the error message "too many operands and not enough operators".

Notes: 1. Include one space between operands ( eg. a b c d ) and operator (eg. + - * /) in your input to the program.

             2. The only operators to consider are +, -, * and /.

Your program should ask the user for a postfix expression as input, and it should output the corresponding fully-parenthesized infix expression. The program should also ask the user if he/she would like to do another conversion. If so, the user should be able to enter another posfixexpression; otherwise the program should terminate. Also, the stack must be implemented using a singly-linked list. Your driver, infix.cpp, should include the definition and declaration files for the class STACK, stack.cpp and stack.h, respectively.

Your program should do error-checking. For example, if the infix expression is invalid (empty, too many operands, etc…), your program should print an error message stating so.

Must have infix.cpp, stack.cpp, and stack.h.

Explanation / Answer

#include <string>
using namespace std;
struct node
{
string data;
struct node *next;
};
class stack
{
struct node *top;
public:
stack()
{
top = 0;
}
void push(string data);
string pop();
};
//stack.cpp
#include "stack.h"
void stack::push(string data)
{
struct node *pn;
pn = new node();
pn->data = data;
pn->next = (top != 0) ? top : 0;
top = pn;
}
string stack::pop()
{
struct node *pn;
if (top == 0) return "";
pn = top;
string result = pn->data;
top = top->next;
delete pn;
return result;
}
// infix.cpp
#include "stack.cpp"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int error;
stack s;
string postfix, infix, operand1, operand2, expr, yn;
do
{
cout << "Enter postfix expression" << endl;
getline(cin, postfix);
error = 0;
for(int i = 0; i < postfix.length(); i++)
{
string c = postfix.substr(i, 1);
if (c == "+" || c == "-" || c == "*" || c == "/")
{
operand2 = s.pop();
if (operand2 == "")
{
cout << "Too many operators and not enough operands" << endl;
error = 1;
break;
}
operand1 = s.pop();
if (operand1 == "")
{
cout << "Too many operators and not enough operands" << endl;
error = 1;
break;
}
expr = "(" + operand1 + " " + c + " " + operand2 + ")";
s.push(expr);
}
else if (c == " ")
{
continue;
}
else
{
s.push(c);
}
}
if (!error)
{
infix = s.pop();
if (s.pop() == "")
{
cout << "The infix expression is" << endl << infix << endl;
}
else
{
cout << "Too many operands and not enough operators" << endl;
while(s.pop() != "");
}
}
cout << "Convert another y/n : ";
cin >> yn;
getchar();
cout<< endl;
}
while(yn == "y" || yn == "Y");
return 0;
}