ImprovedStack.h
#ifndef ImprovedStack_H
#define ImprovedStack_H
#include<iostream>
using namespace std;
template<typename T>
class Stack{
public:
Stack();
~Stack();
bool empty() const;
T peek() const;
void push(T);
T pop();
int getSize() const;
int getCapacity() const;
void printStack() const;
void ensureCapacity();
private:
T * elements;
int capacity;
int size;
};
template<typename T>
Stack<T>::Stack(){
size = 0;
capacity = 16;
elements = new T[capacity];
}
template<typename T>
Stack<T>::~Stack(){
delete [] elements;
}
template<typename T>
bool Stack<T>::empty() const{
return size == 0;
}
template<typename T>
T Stack<T>::peek() const{
return elements[size - 1];
}
template<typename T>
void Stack<T>::ensureCapacity(){
if(size >= capacity){
T* old = elements;
capacity = size * 2;
elements = new T[capacity];
for(int i = 0; i < size; i++)
elements[i] = old[i];
delete [] old;
}
}
template<typename T>
void Stack<T>::push(T value){
ensureCapacity();
elements[size++] = value;
}
template<typename T>
T Stack<T>::pop(){
return elements[--size];
}
template<typename T>
int Stack<T>::getSize() const{
return size;
}
template<typename T>
int Stack<T>::getCapacity() const{
return capacity;
}
template<typename T>
void Stack<T>::printStack() const{
for(int i = 0; i < size; i ++){
cout<<elements[i];
}
cout<<endl;
//cout<<endl<<"capacity is: "<<capacity<<endl;
}
#endif
main.cpp
#include<iostream>
#include<string>
#include "ImprovedStack.h"
using namespace std;
int priority(char opt){
if(opt == '#') return -1;
else if(opt == '(') return 0;
else if(opt == '+' || opt == '-') return 1;
else if(opt == '*' || opt == '/') return 2;
}
void processAnOperator(Stack<int>& operandStack, Stack<char>& operatorStack){
char opt = operatorStack.pop();
int val2 = operandStack.pop();
int val1 = operandStack.pop();
switch(opt){
case '+':
operandStack.push(val1 + val2);
break;
case '-':
operandStack.push(val1 - val2);
break;
case '*':
operandStack.push(val1 * val2);
break;
case '/':
operandStack.push(val1 / val2);
break;
}
}
int evaluateExpression(const string& expression){
Stack<int> operandStack;
Stack<char> operatorStack;
operatorStack.push('#');
for(int i = 0; i < expression.length(); i++){
if(expression[i] >= '0' && expression[i] <= '9')
operandStack.push(expression[i] - '0');
else if(expression[i] == '(')
operatorStack.push('(');
else if(expression[i] == ')'){
while(operatorStack.peek() != '(')
processAnOperator(operandStack,operatorStack);
operatorStack.pop();
}
else if(priority(expression[i]) > priority(operatorStack.peek()))
operatorStack.push(expression[i]);
else{
while(operatorStack.peek() != '#' && priority(expression[i]) <= priority(operatorStack.peek()))
processAnOperator(operandStack,operatorStack);
operatorStack.push(expression[i]);
}
cout<<"operandStack: ";
operandStack.printStack();
cout<<"operatorStack: ";
operatorStack.printStack();
cout<<endl;
}
while(operatorStack.peek() != '#')
processAnOperator(operandStack,operatorStack);
operatorStack.pop();
return operandStack.pop();
}
int main(){
string expression;
cout<<"Enter an expression: ";
getline(cin,expression);
cout<< expression << " = "<<evaluateExpression(expression) <<endl;
return 0;
}