Having problems with my code. This is what I have so far. janderson22Lab5.cpp //
ID: 3675181 • Letter: H
Question
Having problems with my code. This is what I have so far.
janderson22Lab5.cpp
//Main program infix to postfix
#include <iostream>
#include <fstream>
#include <cstring>
#include "myStack.h"
#include "infixToPostfix.h"
using namespace std;
int main()
{
infixToPostfix InfixExp;
string infix;
ifstream infile;
infile.open("testData.txt");
if (!infile)
{
cout << "Cannot open input file. Program terminates!!!" << endl;
return 1;
}
getline(infile, infix);
while (infile)
{
InfixExp.getInfix(infix);
InfixExp.showInfix();
InfixExp.showPostfix();
cout << endl;
getline(infile, infix);
}
infile.close();
return 0;
}
///////////////////////////
Source.cpp
//Implementation File
#include <iostream>
#include <string>
#include "myStack.h"
#include "infixToPostfix.h"
using namespace std;
void infixToPostfix::convertToPostfix()
{
for (int c = 0; c < inFix.size(); c++)
{
sym = inFix[c];
if (isalpha(sym))
{
postFix += sym;
}//if(isalpha(sym)
else if (isdigit(sym))
{
postFix += sym;
}//else if
else
{
switch (sym)
{
case '(':
fixStack.push(sym);
break;
case ')':
if (!fixStack.isEmptyStack())
{
while (fixStack.top() != '(')
{
postFix += fixStack.top();
fixStack.pop();
}//while checking if top of stack is not (
}//if checking if stack is not empty
if (!fixStack.isEmptyStack())
{
fixStack.pop();
}//if checking if stack is not empty
break;
case '+':
case '*':
case '-':
case '/':
if (fixStack.isEmptyStack())
{
fixStack.push(sym);
}//checking if stack is empty
else if (fixStack.top() == '(')
{
fixStack.push(sym);
}//if checking if top of stack is (
else
{
while (precedence())
{
postFix += fixStack.top();
fixStack.pop();
if (fixStack.isEmptyStack())
{
break;
}
}//while checking precefence
fixStack.push(sym);
}
break;
default: //cout << "Error! Sym = " << sym << endl;
break;
}//switch(sym) for picking what to do with each operator
}//else
}//for(c < inFix.size)
while (!fixStack.isEmptyStack())
{
postFix += fixStack.top();
fixStack.pop();
}//while
//Your Source Code;
}//end convertToPostfix
bool infixToPostfix::precedence(char opr1, char opr2)
{
int prec1, prec2;
if (opr1 == '*' || opr1 == '/')
prec1 = 2;
else if (opr1 == '+' || opr1 == '-')
prec1 = 1;
else if (opr1 = '(')
prec1 = 0;
if (opr2 == '*' || opr2 == '/')
prec2 = 2;
else if (opr2 == '+' || opr2 == '-')
prec2 = 1;
return(prec1 >= prec2);
}//end precedence
void infixToPostfix::getInfix(string data)
{
ifx = data;
convertToPostfix();
}
void infixToPostfix::showInfix()
{
cout << "Infix: " << ifx << endl;
}
void infixToPostfix::showPostfix()
{
cout << "Postfix: " << pfx << endl;
}
infixToPostfix::infixToPostfix(string infx)
{
ifx = infx;
convertToPostfix();
}
///////////////////////////////////////////////////////////////////
myStack.h
//Header file: myStack.h
#ifndef H_StackType
#define H_StackType
#include <iostream>
#include <cassert>
#include "stackADT.h"
using namespace std;
//*************************************************************
// Author: D.S. Malik
//
// This class specifies the basic operation on a stack as an
// array.
//*************************************************************
template <class Type>
class stackType : public stackADT<Type>
{
public:
const stackType<Type>& operator=(const stackType<Type>&);
//Overload the assignment operator.
void initializeStack();
//Function to initialize the stack to an empty state.
//Postcondition: stackTop = 0;
bool isEmptyStack() const;
//Function to determine whether the stack is empty.
//Postcondition: Returns true if the stack is empty,
// otherwise returns false.
bool isFullStack() const;
//Function to determine whether the stack is full.
//Postcondition: Returns true if the stack is full,
// otherwise returns false.
void push(const Type& newItem);
//Function to add newItem to the stack.
//Precondition: The stack exists and is not full.
//Postcondition: The stack is changed and newItem is
// added to the top of the stack.
Type top() const;
//Function to return the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: If the stack is empty, the program
// terminates; otherwise, the top element of the stack
// is returned.
void pop();
//Function to remove the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: The stack is changed and the top element is
// removed from the stack.
stackType(int stackSize = 100);
//Constructor
//Create an array of the size stackSize to hold
//the stack elements. The default stack size is 100.
//Postcondition: The variable list contains the base address
// of the array, stackTop = 0, and maxStackSize = stackSize
stackType(const stackType<Type>& otherStack);
//Copy constructor
~stackType();
//Destructor
//Remove all the elements from the stack.
//Postcondition: The array (list) holding the stack
// elements is deleted.
private:
int maxStackSize; //variable to store the maximum stack size
int stackTop; //variable to point to the top of the stack
Type *list; //pointer to the array that holds the stack elements
void copyStack(const stackType<Type>& otherStack);
//Function to make a copy of otherStack.
//Postcondition: A copy of otherStack is created and assigned
// to this stack.
};
template <class Type>
void stackType<Type>::initializeStack()
{
stackTop = 0;
}//end initializeStack
template <class Type>
bool stackType<Type>::isEmptyStack() const
{
return(stackTop == 0);
}//end isEmptyStack
template <class Type>
bool stackType<Type>::isFullStack() const
{
return(stackTop == maxStackSize);
} //end isFullStack
template <class Type>
void stackType<Type>::push(const Type& newItem)
{
if (!isFullStack())
{
list[stackTop] = newItem; //add newItem to the
//top of the stack
stackTop++; //increment stackTop
}
else
cout << "Cannot add to a full stack." << endl;
}//end push
template <class Type>
Type stackType<Type>::top() const
{
assert(stackTop != 0); //if stack is empty,
//terminate the program
return list[stackTop - 1]; //return the element of the
//stack indicated by
//stackTop - 1
}//end top
template <class Type>
void stackType<Type>::pop()
{
if (!isEmptyStack())
stackTop--; //decrement stackTop
else
cout << "Cannot remove from an empty stack." << endl;
}//end pop
template <class Type>
stackType<Type>::stackType(int stackSize)
{
if (stackSize <= 0)
{
cout << "Size of the array to hold the stack must "
<< "be positive." << endl;
cout << "Creating an array of size 100." << endl;
maxStackSize = 100;
}
else
maxStackSize = stackSize; //set the stack size to
//the value specified by
//the parameter stackSize
stackTop = 0; //set stackTop to 0
list = new Type[maxStackSize]; //create the array to
//hold the stack elements
}//end constructor
template <class Type>
stackType<Type>::~stackType() //destructor
{
delete[] list; //deallocate the memory occupied
//by the array
}//end destructor
template <class Type>
void stackType<Type>::copyStack(const stackType<Type>& otherStack)
{
delete[] list;
maxStackSize = otherStack.maxStackSize;
stackTop = otherStack.stackTop;
list = new Type[maxStackSize];
//copy otherStack into this stack
for (int j = 0; j < stackTop; j++)
list[j] = otherStack.list[j];
} //end copyStack
template <class Type>
stackType<Type>::stackType(const stackType<Type>& otherStack)
{
list = NULL;
copyStack(otherStack);
}//end copy constructor
template <class Type>
const stackType<Type>& stackType<Type>::operator=
(const stackType<Type>& otherStack)
{
if (this != &otherStack) //avoid self-copy
copyStack(otherStack);
return *this;
} //end operator=
#endif
//////////////////////////////////////////////////////////////////////////////////////
infixToPush.h
// Specification file for InfixToPostfix.h
#ifndef H_InfixToPostfix
#define H_InfixToPostfix
#include <string>
using namespace std;
class infixToPostfix
{
public:
void convertToPostfix();
bool precedence(char opr1, char opr2);
void getInfix(string);
void showInfix();
void showPostfix();
infixToPostfix(string = ""); //Default constructor
private:
string ifx;
string pfx;
};
#endif
/////////////////////////////////////////////////////////////////////////////////
stackADT.h
//Header file: myStack.h
#ifndef H_StackType
#define H_StackType
#include <iostream>
#include <cassert>
#include "stackADT.h"
using namespace std;
//*************************************************************
// Author: D.S. Malik
//
// This class specifies the basic operation on a stack as an
// array.
//*************************************************************
template <class Type>
class stackType : public stackADT<Type>
{
public:
const stackType<Type>& operator=(const stackType<Type>&);
//Overload the assignment operator.
void initializeStack();
//Function to initialize the stack to an empty state.
//Postcondition: stackTop = 0;
bool isEmptyStack() const;
//Function to determine whether the stack is empty.
//Postcondition: Returns true if the stack is empty,
// otherwise returns false.
bool isFullStack() const;
//Function to determine whether the stack is full.
//Postcondition: Returns true if the stack is full,
// otherwise returns false.
void push(const Type& newItem);
//Function to add newItem to the stack.
//Precondition: The stack exists and is not full.
//Postcondition: The stack is changed and newItem is
// added to the top of the stack.
Type top() const;
//Function to return the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: If the stack is empty, the program
// terminates; otherwise, the top element of the stack
// is returned.
void pop();
//Function to remove the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: The stack is changed and the top element is
// removed from the stack.
stackType(int stackSize = 100);
//Constructor
//Create an array of the size stackSize to hold
//the stack elements. The default stack size is 100.
//Postcondition: The variable list contains the base address
// of the array, stackTop = 0, and maxStackSize = stackSize
stackType(const stackType<Type>& otherStack);
//Copy constructor
~stackType();
//Destructor
//Remove all the elements from the stack.
//Postcondition: The array (list) holding the stack
// elements is deleted.
private:
int maxStackSize; //variable to store the maximum stack size
int stackTop; //variable to point to the top of the stack
Type *list; //pointer to the array that holds the stack elements
void copyStack(const stackType<Type>& otherStack);
//Function to make a copy of otherStack.
//Postcondition: A copy of otherStack is created and assigned
// to this stack.
};
template <class Type>
void stackType<Type>::initializeStack()
{
stackTop = 0;
}//end initializeStack
template <class Type>
bool stackType<Type>::isEmptyStack() const
{
return(stackTop == 0);
}//end isEmptyStack
template <class Type>
bool stackType<Type>::isFullStack() const
{
return(stackTop == maxStackSize);
} //end isFullStack
template <class Type>
void stackType<Type>::push(const Type& newItem)
{
if (!isFullStack())
{
list[stackTop] = newItem; //add newItem to the
//top of the stack
stackTop++; //increment stackTop
}
else
cout << "Cannot add to a full stack." << endl;
}//end push
template <class Type>
Type stackType<Type>::top() const
{
assert(stackTop != 0); //if stack is empty,
//terminate the program
return list[stackTop - 1]; //return the element of the
//stack indicated by
//stackTop - 1
}//end top
template <class Type>
void stackType<Type>::pop()
{
if (!isEmptyStack())
stackTop--; //decrement stackTop
else
cout << "Cannot remove from an empty stack." << endl;
}//end pop
template <class Type>
stackType<Type>::stackType(int stackSize)
{
if (stackSize <= 0)
{
cout << "Size of the array to hold the stack must "
<< "be positive." << endl;
cout << "Creating an array of size 100." << endl;
maxStackSize = 100;
}
else
maxStackSize = stackSize; //set the stack size to
//the value specified by
//the parameter stackSize
stackTop = 0; //set stackTop to 0
list = new Type[maxStackSize]; //create the array to
//hold the stack elements
}//end constructor
template <class Type>
stackType<Type>::~stackType() //destructor
{
delete[] list; //deallocate the memory occupied
//by the array
}//end destructor
template <class Type>
void stackType<Type>::copyStack(const stackType<Type>& otherStack)
{
delete[] list;
maxStackSize = otherStack.maxStackSize;
stackTop = otherStack.stackTop;
list = new Type[maxStackSize];
//copy otherStack into this stack
for (int j = 0; j < stackTop; j++)
list[j] = otherStack.list[j];
} //end copyStack
template <class Type>
stackType<Type>::stackType(const stackType<Type>& otherStack)
{
list = NULL;
copyStack(otherStack);
}//end copy constructor
template <class Type>
const stackType<Type>& stackType<Type>::operator=
(const stackType<Type>& otherStack)
{
if (this != &otherStack) //avoid self-copy
copyStack(otherStack);
return *this;
} //end operator=
#endif
///////////////////////////////////////////////////////////////////////////////////////////////
testData.txt
A+B-C;
(A+B)*C;
(A+B)*(C-D);
A+((B+C)*(E-F)-G)/(H-I);
A+B*(C+D)-E/F*G+H;
Explanation / Answer
infixToPostfixImp.cpp
//Implementation File
#include <iostream>
#include <string>
#include "myStack.h"
#include "infixToPostfix.h"
using namespace std;
void infixToPostfix::convertToPostfix()
{
stackType<char> stack(50);
char stackOpr;
stack.initializeStack();
pfx = "";
int len = ifx.length();
for (int i = 0; i < len; i++)
if (ifx[i] >= 'A' && ifx[i] <= 'Z')
pfx = pfx + ifx[i];
else
{
switch (ifx[i])
{
case '(':
stack.push(ifx[i]);
break;
case ')':
stackOpr = stack.top();
stack.pop();
while (stackOpr != '(')
{
pfx = pfx + stackOpr;
if (!stack.isEmptyStack())
{
stackOpr = stack.top();
stack.pop();
}
else
break;
}
break;
case ';':
case ' ':
break;
default:
if (stack.isEmptyStack())
stack.push(ifx[i]);
else
{
stackOpr = stack.top();
stack.pop();
while (precedence(stackOpr,ifx[i]))
{
pfx = pfx + stackOpr;
if (!stack.isEmptyStack())
{
stackOpr = stack.top();
stack.pop();
}
else
break;
}
if (!precedence(stackOpr,ifx[i]))
stack.push(stackOpr);
stack.push(ifx[i]);
}
}//end switch
}//end else
while (!stack.isEmptyStack())
{
pfx += stack.top();
stack.pop();
}
}//end convertToPostfix
bool infixToPostfix::precedence(char opr1, char opr2)
{
int prec1, prec2;
if (opr1 == '*' || opr1 =='/')
prec1 = 2;
else if(opr1 == '+' || opr1 == '-')
prec1 = 1;
else if(opr1 ='(')
prec1 = 0;
if (opr2 == '*' || opr2 == '/')
prec2 = 2;
else if(opr2 =='+' || opr2 == '-')
prec2 = 1;
return(prec1 >= prec2);
}//end precedence
void infixToPostfix::getInfix(string data)
{
ifx = data;
convertToPostfix();
}
void infixToPostfix::showInfix()
{
cout << "Infix: " << ifx << endl;
}
void infixToPostfix::showPostfix()
{
cout << "Postfix: " << pfx << endl;
}
infixToPostfix::infixToPostfix(string infx)
{
ifx = infx;
convertToPostfix();
}
infixToPostfix.h
// Specification file for InfixToPostfix.h
#ifndef H_InfixToPostfix
#define H_InfixToPostfix
#include <string>
using namespace std;
class infixToPostfix
{
public:
void convertToPostfix();
bool precedence(char opr1, char opr2);
void getInfix(string);
void showInfix();
void showPostfix();
infixToPostfix(string = ""); //Default constructor
private:
string ifx;
string pfx;
};
#endif
main.cpp
//Main program infix to postfix
#include <iostream>
#include <fstream>
#include <cstring>
#include "myStack.h"
#include "infixToPostfix.h"
using namespace std;
int main()
{
infixToPostfix InfixExp;
string infix;
ifstream infile;
infile.open("Data.txt");
if (!infile)
{
cout << "Cannot open input file. Program terminates!!!" << endl;
return 1;
}
getline(infile, infix);
while (infile)
{
InfixExp.getInfix(infix);
InfixExp.showInfix();
InfixExp.showPostfix();
cout << endl;
getline(infile, infix);
}
infile.close();
return 0;
}
myStack.h
//Header file: myStack.h
#ifndef H_StackType
#define H_StackType
#include <iostream>
#include <cassert>
#include "stackADT.h"
using namespace std;
template <class Type>
class stackType: public stackADT<Type>
{
public:
const stackType<Type>& operator=(const stackType<Type>&);
//Overload the assignment operator.
void initializeStack();
//Function to initialize the stack to an empty state.
//Postcondition: stackTop = 0;
bool isEmptyStack() const;
//Function to determine whether the stack is empty.
//Postcondition: Returns true if the stack is empty,
// otherwise returns false.
bool isFullStack() const;
//Function to determine whether the stack is full.
//Postcondition: Returns true if the stack is full,
// otherwise returns false.
void push(const Type& newItem);
//Function to add newItem to the stack.
//Precondition: The stack exists and is not full.
//Postcondition: The stack is changed and newItem is
// added to the top of the stack.
Type top() const;
//Function to return the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: If the stack is empty, the program
// terminates; otherwise, the top element of the stack
// is returned.
void pop();
//Function to remove the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: The stack is changed and the top element is
// removed from the stack.
stackType(int stackSize = 100);
//Constructor
//Create an array of the size stackSize to hold
//the stack elements. The default stack size is 100.
//Postcondition: The variable list contains the base address
// of the array, stackTop = 0, and maxStackSize = stackSize
stackType(const stackType<Type>& otherStack);
//Copy constructor
~stackType();
//Destructor
//Remove all the elements from the stack.
//Postcondition: The array (list) holding the stack
// elements is deleted.
private:
int maxStackSize; //variable to store the maximum stack size
int stackTop; //variable to point to the top of the stack
Type *list; //pointer to the array that holds the stack elements
void copyStack(const stackType<Type>& otherStack);
//Function to make a copy of otherStack.
//Postcondition: A copy of otherStack is created and assigned
// to this stack.
};
template <class Type>
void stackType<Type>::initializeStack()
{
stackTop = 0;
}//end initializeStack
template <class Type>
bool stackType<Type>::isEmptyStack() const
{
return(stackTop == 0);
}//end isEmptyStack
template <class Type>
bool stackType<Type>::isFullStack() const
{
return(stackTop == maxStackSize);
} //end isFullStack
template <class Type>
void stackType<Type>::push(const Type& newItem)
{
if (!isFullStack())
{
list[stackTop] = newItem; //add newItem to the
//top of the stack
stackTop++; //increment stackTop
}
else
cout << "Cannot add to a full stack." << endl;
}//end push
template <class Type>
Type stackType<Type>::top() const
{
assert(stackTop != 0); //if stack is empty,
//terminate the program
return list[stackTop - 1]; //return the element of the
//stack indicated by
//stackTop - 1
}//end top
template <class Type>
void stackType<Type>::pop()
{
if (!isEmptyStack())
stackTop--; //decrement stackTop
else
cout << "Cannot remove from an empty stack." << endl;
}//end pop
template <class Type>
stackType<Type>::stackType(int stackSize)
{
if (stackSize <= 0)
{
cout << "Size of the array to hold the stack must "
<< "be positive." << endl;
cout << "Creating an array of size 100." << endl;
maxStackSize = 100;
}
else
maxStackSize = stackSize; //set the stack size to
//the value specified by
//the parameter stackSize
stackTop = 0; //set stackTop to 0
list = new Type[maxStackSize]; //create the array to
//hold the stack elements
}//end constructor
template <class Type>
stackType<Type>::~stackType() //destructor
{
delete [] list; //deallocate the memory occupied
//by the array
}//end destructor
template <class Type>
void stackType<Type>::copyStack(const stackType<Type>& otherStack)
{
delete [] list;
maxStackSize = otherStack.maxStackSize;
stackTop = otherStack.stackTop;
list = new Type[maxStackSize];
//copy otherStack into this stack
for (int j = 0; j < stackTop; j++)
list[j] = otherStack.list[j];
} //end copyStack
template <class Type>
stackType<Type>::stackType(const stackType<Type>& otherStack)
{
list = NULL;
copyStack(otherStack);
}//end copy constructor
template <class Type>
const stackType<Type>& stackType<Type>::operator=
(const stackType<Type>& otherStack)
{
if (this != &otherStack) //avoid self-copy
copyStack(otherStack);
return *this;
} //end operator=
#endif
stackADT.h
//Header file: stackADT.h
#ifndef H_StackADT
#define H_StackADT
template <class Type>
class stackADT
{
public:
virtual void initializeStack() = 0;
//Method to initialize the stack to an empty state.
//Postcondition: Stack is empty.
virtual bool isEmptyStack() const = 0;
//Function to determine whether the stack is empty.
//Postcondition: Returns true if the stack is empty,
// otherwise returns false.
virtual bool isFullStack() const = 0;
//Function to determine whether the stack is full.
//Postcondition: Returns true if the stack is full,
// otherwise returns false.
virtual void push(const Type& newItem) = 0;
//Function to add newItem to the stack.
//Precondition: The stack exists and is not full.
//Postcondition: The stack is changed and newItem is added
// to the top of the stack.
virtual Type top() const = 0;
//Function to return the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: If the stack is empty, the program
// terminates; otherwise, the top element of the stack
// is returned.
virtual void pop() = 0;
//Function to remove the top element of the stack.
//Precondition: The stack exists and is not empty.
//Postcondition: The stack is changed and the top element
// is removed from the stack.
};
#endif
Data.txt
A+B-C;
(A+B)*C;
(A+B)*(C-D);
A+((B+C)*(E-F)-G)/(H-I);
A+B*(C+D)-E/F*G+H;
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.