So for Homework I had to write an RPN Evaluator and write the results to a text file. I've done all that - fine and dandy but it feels weird. Like the writing to my results text file. It doesn't feel efficient. There are some constraints like no Vector or String Libraries and no other external classes besides my stack. Any tips on how I can improve this?
Here are pastebin files: Main.cpp, Stack.h, RPN Expressions, and my Results Output File
Main.cpp
#include <iostream>
#include <iomanip>
#include <fstream>
#include <ctype.h>
using namespace std;
#include "stack.h"
//**************************************************************************
bool writeOperate(Stack<int>&, ofstream&, char);
void writePush(Stack<int>&, ofstream&, char[]);
void getResult(Stack<int>&, ofstream&, bool);
//**************************************************************************
int main()
{
char token[3];
bool valid = true;
Stack<int> stack(10);
ifstream expressions;
ofstream results;
expressions.open("expressions.txt");
results.open("results.txt");
while(expressions >> token)
{
if(token[0] == ';')
getResult(stack, results, valid);
else if(isdigit(token[0]))
writePush(stack, results, token);
else if(ispunct(token[0]))
valid = writeOperate(stack, results, token[0]);
}
return 0;
}
//**************************************************************************
void writePush(Stack<int>& stack, ofstream& file, char* numStr)
{
int num = atoi(numStr);
cout << numStr << " ";
stack.push(num);
file << "(Token: " << numStr << left << setfill(' ') << setw(15) << ")" ;
file << "Push " << numStr << endl;
}
//**************************************************************************
bool writeOperate(Stack<int>& stack, ofstream& file, char op)
{
int num1,
num2;
int total = 0;
bool success = false;
cout << op << " ";
stack.pop(num2);
if(stack.pop(num1))
{
switch (op)
{
case '+':
total = num1 + num2;
break;
case '-':
total = num1 - num2;
break;
case '*':
total = num1 * num2;
break;
case '/':
total = num1 / num2;
break;
case '%':
total = num1 % num2;
break;
}
stack.push(total);
success = true;
}
file << "(Token: " << op << left << setfill(' ') << setw(15) << ")";
file << "Pop " << left << setfill(' ') << setw(15) << num1;
file << "Pop " << left << setfill(' ') << setw(15) << num2;
file << "Push " << total << endl;
return success;
}
//**************************************************************************
void getResult(Stack<int>& stack, ofstream& file, bool success)
{
int total;
int size = stack.getSize();
if(size == 1 && success)
{
stack.pop(total);
cout << "= " << total << endl;
file << "\t\t\t\t";
file << left << setfill(' ') << setw(15) << "Valid: ";
file << "result = " << total;
size--;
}
else
{
cout << "= Invalid" << endl;
file << "\t\t\t\t";
file << "RPN Expressions is Invalid";
}
file << "\n\n\n";
for(int i = 0; i < size; i++)
{
stack.pop(total);
}
}
Stack.h
#ifndef STACK_H
#define STACK_H
//**************************************************************************
template<typename TYPE>
class Stack
{
private:
TYPE* stack;
int top,
capacity;
public:
Stack(int c = 100);
~Stack();
bool push(const TYPE&);
bool pop(TYPE&);
bool peek (TYPE&) const;
bool isEmpty() const;
bool isFull() const;
int getSize() const;
};
//**************************************************************************
template<typename TYPE>
Stack<TYPE>::Stack(int c)
{
capacity = c;
stack = new(nothrow) TYPE[capacity];
top = -1;
};
//**************************************************************************
template<typename TYPE>
Stack<TYPE>::~Stack()
{
delete[] stack;
capacity = 0;
top = -1;
};
//**************************************************************************
template<typename TYPE>
bool Stack<TYPE>::push(const TYPE& dataIn)
{
bool success = false;
if(top + 1 < capacity)
{
top++;
stack[top] = dataIn;
success = true;
}
return success;
};
//**************************************************************************
template<typename TYPE>
bool Stack<TYPE>::pop(TYPE& dataOut)
{
bool success = false;
if(top > -1)
{
dataOut = stack[top];
top--;
success = true;
}
return success;
};
//**************************************************************************
template<typename TYPE>
bool Stack<TYPE>::peek(TYPE& dataOut) const
{
bool success = false;
if(top > -1)
{
dataOut = stack[top];
success = true;
}
return success;
};
//**************************************************************************
template<typename TYPE>
int Stack<TYPE>::getSize() const
{
return (top + 1);
};
//**************************************************************************
template<typename TYPE>
bool Stack<TYPE>::isEmpty() const
{
return (top == -1);
};
//**************************************************************************
template<typename TYPE>
bool Stack<TYPE>::isFull() const
{
return (top + 1 == capacity);
};
#endif
Expressions.txt
2 4 * 5 + ;
13 5 % 5 + ;
15 1 + 2 / 1 - ;
15 + 1 + 2 / 1 - ;
3 4 + 15 10 - * ;
3 4 + 6 15 10 - * ;
4 5 - 7 * 2 3 + + ;
2 13 + 14 6 - - 5 * 4 + ;
35 6 4 2 2 / + * - ;
3 4 + 1 2 - * 4 2 / 3 - + ;
3 14 1 2 4 2 3 + % * + - + ;
9 2 1 + / 11 * ;
Results.txt
(Token: 2) Push 2
(Token: 4) Push 4
(Token: *) Pop 2 Pop 4 Push 8
(Token: 5) Push 5
(Token: +) Pop 8 Pop 5 Push 13
Valid: result = 13
(Token: 13) Push 13
(Token: 5) Push 5
(Token: %) Pop 13 Pop 5 Push 3
(Token: 5) Push 5
(Token: +) Pop 3 Pop 5 Push 8
Valid: result = 8
(Token: 15) Push 15
(Token: 1) Push 1
(Token: +) Pop 15 Pop 1 Push 16
(Token: 2) Push 2
(Token: /) Pop 16 Pop 2 Push 8
(Token: 1) Push 1
(Token: -) Pop 8 Pop 1 Push 7
Valid: result = 7
(Token: 15) Push 15
(Token: +) Pop -858993460 Pop 15 Push 0
(Token: 1) Push 1
(Token: +) Pop -858993460 Pop 1 Push 0
(Token: 2) Push 2
(Token: /) Pop -858993460 Pop 2 Push 0
(Token: 1) Push 1
(Token: -) Pop -858993460 Pop 1 Push 0
RPN Expressions is Invalid
(Token: 3) Push 3
(Token: 4) Push 4
(Token: +) Pop 3 Pop 4 Push 7
(Token: 15) Push 15
(Token: 10) Push 10
(Token: -) Pop 15 Pop 10 Push 5
(Token: *) Pop 7 Pop 5 Push 35
Valid: result = 35
(Token: 3) Push 3
(Token: 4) Push 4
(Token: +) Pop 3 Pop 4 Push 7
(Token: 6) Push 6
(Token: 15) Push 15
(Token: 10) Push 10
(Token: -) Pop 15 Pop 10 Push 5
(Token: *) Pop 6 Pop 5 Push 30
RPN Expressions is Invalid
(Token: 4) Push 4
(Token: 5) Push 5
(Token: -) Pop 4 Pop 5 Push -1
(Token: 7) Push 7
(Token: *) Pop -1 Pop 7 Push -7
(Token: 2) Push 2
(Token: 3) Push 3
(Token: +) Pop 2 Pop 3 Push 5
(Token: +) Pop -7 Pop 5 Push -2
Valid: result = -2
(Token: 2) Push 2
(Token: 13) Push 13
(Token: +) Pop 2 Pop 13 Push 15
(Token: 14) Push 14
(Token: 6) Push 6
(Token: -) Pop 14 Pop 6 Push 8
(Token: -) Pop 15 Pop 8 Push 7
(Token: 5) Push 5
(Token: *) Pop 7 Pop 5 Push 35
(Token: 4) Push 4
(Token: +) Pop 35 Pop 4 Push 39
Valid: result = 39
(Token: 35) Push 35
(Token: 6) Push 6
(Token: 4) Push 4
(Token: 2) Push 2
(Token: 2) Push 2
(Token: /) Pop 2 Pop 2 Push 1
(Token: +) Pop 4 Pop 1 Push 5
(Token: *) Pop 6 Pop 5 Push 30
(Token: -) Pop 35 Pop 30 Push 5
Valid: result = 5
(Token: 3) Push 3
(Token: 4) Push 4
(Token: +) Pop 3 Pop 4 Push 7
(Token: 1) Push 1
(Token: 2) Push 2
(Token: -) Pop 1 Pop 2 Push -1
(Token: *) Pop 7 Pop -1 Push -7
(Token: 4) Push 4
(Token: 2) Push 2
(Token: /) Pop 4 Pop 2 Push 2
(Token: 3) Push 3
(Token: -) Pop 2 Pop 3 Push -1
(Token: +) Pop -7 Pop -1 Push -8
Valid: result = -8
(Token: 3) Push 3
(Token: 14) Push 14
(Token: 1) Push 1
(Token: 2) Push 2
(Token: 4) Push 4
(Token: 2) Push 2
(Token: 3) Push 3
(Token: +) Pop 2 Pop 3 Push 5
(Token: %) Pop 4 Pop 5 Push 4
(Token: *) Pop 2 Pop 4 Push 8
(Token: +) Pop 1 Pop 8 Push 9
(Token: -) Pop 14 Pop 9 Push 5
(Token: +) Pop 3 Pop 5 Push 8
Valid: result = 8
(Token: 9) Push 9
(Token: 2) Push 2
(Token: 1) Push 1
(Token: +) Pop 2 Pop 1 Push 3
(Token: /) Pop 9 Pop 3 Push 3
(Token: 11) Push 11
(Token: *) Pop 3 Pop 11 Push 33
Valid: result = 33