#include "Stack.h"
#include <iostream>
int current;
int flag=1;
using namespace std;
bool stack::isEmpty()
{
if (top == -1)
{
flag=0;
return true;
}
else
{
return false;
}
}
bool stack::push(const double pushvalue)
{
if (top == size)
{
cout << "illegal" << endl;
flag=0;
return false;
}
st[++top] = pushvalue;
return true;
}
bool stack::pop(double& popvalue)
{
current=top;
if (top == -1)
{
cout << "illegal" << endl;
flag=0;
return false;
}
popvalue = st[top--];
return true;
}
void calculator::run()
{
char instream;
double number;
while (cin >> instream)
{
if(flag==0)
{
break;
}
switch (instream)
{
case'+':
case'-':
case'*':
case'/':
calculate(instream);
break;
default:
cin.putback(instream);
cin >> number;
data.push(number);
}
if (cin.get() == '\n')
{
break;
}
}
double finalnumber;
data.pop(finalnumber);
if(current==0)
{
cout<<finalnumber<<endl;
}
if(current!=-1&¤t>0)
{
cout<<"illegal"<<endl;
flag=0;
}
}
void calculator::calculate(char symbolvalue)
{
double a, b;
if (get(a, b))
{
switch (symbolvalue)
{
case'+':
{
data.push(a + b);
break;
}
case'-':
{
data.push(a - b);
break;
}
case'*':
{
data.push(a * b);
break;
}
case'/':
{
if (b == 0.0)
{
clear();
break;
}
else
{
data.push(a / b);
break;
}
}
}
}
else
{
clear();
}
}
void calculator::clear()
{
data.~stack();
}
bool calculator::get(double& a, double& b)
{
if (data.isEmpty())
{
return false;
}
data.pop(b);
if (data.isEmpty())
{
return false;
}
data.pop(a);
return true;
}