#include <iostream>
#include "../mystack/Mystack.cpp"
#include <limits>
using namespace std;
void introduction();
void cmdgo(char &usercmd,double &usernum,Mystack<double> &polishcal);
bool user_cmd(char usercmd);
int main()
{ char usercmd;
double usernum=0;
Mystack<double> polishcal;
introduction();
cout<<"Select command and press <Enter>:";
cin>>usercmd;
while(!user_cmd(usercmd)){
cmdgo(usercmd,usernum,polishcal);
cout<<"Select command and press <Enter>:";
cin>>usercmd;
}
cout<<"Calculation finished."<<endl;
return 0;
}
void introduction()/*
pre:none;
post: the game intriduction;
*/{
cout<<"This is a reverse Polish Calculator."<<endl;
cout <<"Please enter a valid command:"<<endl;
cout<<"[?]push to stack, [+] [-] [*] [/] are arithmetic operations,[=]print top;"<<endl;
cout<<"[Q]uit."<<endl;
};
void cmdgo(char &usercmd,double &usernum,Mystack<double> &polishcal)/*
pre:none;
post: [?]push to stack, [+] [-] [*] [/] are arithmetic operations,[=]print top;
*/{
switch(usercmd){double a,b;
case '?':
cout<<"Enter a real number:";
cin>>usernum;
while (cin.fail() || usernum < -100.0 || usernum > 64.0) {
// Clear the error flags
cin.clear();
// Discard the bad input
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input. Please enter a number!: ";
cin >> usernum;
}
polishcal.push(usernum);
break;
case '=':
polishcal.top(a);
cout<<a<<endl;
break;
case '+':
polishcal.top(a);
polishcal.pop();
if (polishcal.empty()) {cout<<"your polishcal underflow!"<<endl;polishcal.push(a);break;}
polishcal.top(b);
polishcal.pop();
//cout<<shuchu<<endl;
polishcal.push(b+a);
//cout<<shuchu<<endl;
break;
case '-':
polishcal.top(a);
polishcal.pop();
if (polishcal.empty()) {cout<<"your polishcal underflow!"<<endl;polishcal.push(a);break;}
polishcal.top(b);
polishcal.pop();
polishcal.push(b-a);
break;
case '*':
polishcal.top(a);
polishcal.pop();
if (polishcal.empty()) {cout<<"your polishcal underflow!"<<endl;polishcal.push(a);break;}
polishcal.top(b);
polishcal.pop();
polishcal.push(b*a);
break;
case '/':
polishcal.top(a);
polishcal.pop();
if (polishcal.empty()) {cout<<"your polishcal underflow!"<<endl;polishcal.push(a);break;}
polishcal.top(b);
polishcal.pop();
polishcal.push(b/a);
break;
default:
cout<<"This can't be handled!"<<endl;break;
};}
bool user_cmd(char usercmd)/*
pre:none;
post: judge whether the command is Q;
*/{
return usercmd=='q'||usercmd=='Q';
}