$24
In this homework assignment, you are supposed to implement a program for manipulating algebraic expressions of in x, pre x, and post x forms. Your implementation should enable the user to convert an expression of one form to another as well as to evaluate the expression.
Your implementation MUST include the following global functions whose details are given below. Note that we will use these function prototypes to test your programs. Thus, you are not allowed to change the prototypes of these functions. On the other hand, you are free to add as many additional functions as you would like into your implementation.
• It converts an infix expression exp to its equivalent prefix form. string infix2prefix( const string exp );
• It converts an infix expression exp to its equivalent postfix form. string infix2postfix( const string exp );
• It converts a prefix expression exp to its equivalent infix form. string prefix2infix( const string exp );
• It converts a prefix expression exp to its equivalent postfix form. string prefix2postfix( const string exp );
• It converts a postfix expression exp to its equivalent infix form. string postfix2infix( const string exp );
• It converts a postfix expression exp to its equivalent prefix form. string postfix2prefix( const string exp );
//It evaluates an infix expression.
double evaluateInfix( const string exp );
//It evaluates a prefix expression.
double evaluatePrefix( const string exp );
//It evaluates a postfix expression.
double evaluatePostfix( const string exp );
You MUST use the ADT stack in your implementation. Thus, you will de ne and implement a class for the ADT stack and use it in your functions. Note that you are allowed to use the C++ codes that are given in your textbook but are not allowed to use any other stack implementation. For example, you cannot use the stack class de ned in another book or on a web site. Similarly, you are not allowed to use any stack related functions (any other data structure related functions or classes) in the C++ standard template library (STL).
In your algorithms, you may have the following assumptions:
• The input strings are syntactically correct expressions. For example, you may assume that the string is a valid in x expression when the infix2prefix function is called or you may assume that the string is a valid pre x expression when the evaluatePrefix function is called.
• An input string can include only digits, binary operators and space. You may assume that only the binary operators *, /, +, and - are allowed (no unary and exponentiation operators are allowed). Note that operands can contain multiple digits. Operands and operators are separated with empty space.
1
• In case of in x expressions, the string can also include parentheses in addition to digits, binary operators and space.
Here is an example test program that uses these functions. We will use a similar (but di erent) program to test your solution so make sure that you test your solutions thoroughly.
#include "AlgebraicExpression.h"
int main() {
cout << infix2prefix("( 12 + 5 ) - 20 * 4") << endl; cout << infix2postfix("( 12 + 5 ) - 20 * 4") << endl; cout << evaluateInfix("( 12 + 5 ) - 20 * 4") << endl; cout << prefix2infix("* + * 100 2 4 - 12 4") << endl; cout << prefix2postfix("* + * 100 2 4 - 12 4") << endl; cout << evaluatePrefix("* + * 100 2 4 - 12 4") << endl; cout << postfix2infix("100 12 2 - 8 * + 4 /") << endl; cout << postfix2prefix("100 12 2 - 8 * + 4 /") << endl; cout << evaluatePostfix("100 12 2 - 8 * + 4 /") << endl; return 0;
}
Notes:
• This assignment is due by 23:59 on Monday, January 3, 2022. It will be graded by your TA Hakan Turkmenoglu (h.turkmenoglu@bilkent.edu.tr), you may ask your homework related questions to him.
• In this assignment, you must have separate interface and implementation les (i.e., separate .h and .cpp les). We will test your implementation by writing our own driver .cpp le which will include your header les. For this reason, your le names MUST BE Stack.h, Stack.cpp, AlgebraicExpression.h and AlgebraicExpression.cpp.
• You should put these les into a folder and zip the folder. The name of this zip le should conform to the following name convention: secX-Firstname-Lastname-StudentID.zip where X is your section number.
The submissions that do not obey these rules will not be graded. You must also write your own driver le, which must be di erent from the one that we gave above, to test each of your functions. You MUST submit this test code as well in the archive le.
• Before 23:59 on January 3rd, you need to upload this zipped le to Moodle.
No hardcopy submission is needed. The standard rules about late homework submissions ap-ply. Please see the course syllabus for further discussion of the late homework policy as well as academic integrity.
• You can reuse the codes and pseudocodes on the lecture slides if you need, but other than that, the code must be your own implementation.
• Your code must not have any memory leaks. You will lose points if you have memory leaks in your program even though the outputs of the operations are correct.
• You are free to write your programs in any environment (you may use Linux, Mac OS or Win-dows). On the other hand, we will test your programs on dijkstra.ug.bcc.bilkent.edu.tr and we will expect your programs to compile and run on the dijkstra machine. If we could not get your program properly work on the dijkstra machine, you would lose a considerable amount of points. Therefore, we recommend you to make sure that your program compiles and prop-erly works on dijkstra.ug.bcc.bilkent.edu.tr before submitting your assignment. Note that you are NOT allowed to use C++11 on the dijkstra machine, so do NOT use the -std compiler ag as we will test your implementation on the default C++ version.
2