设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。要检查有关运算的条件,并对错误的条件产生报警。
好吧。。。敲完这题我虚弱了。。。我真TMd虚弱了啊!!。。~~~~(>_<)~~~~╮(╯﹏╰)╭
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<utility>
#include<complex>
#include<cstdlib>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cctype>
#include<limits>
#include<cmath>
#include<queue>
#include<stack>
#include<deque>
#include<cmath>
#include<ctime>
#include<list>
#include<map>
#include<set>
using namespace std;
const int inf=0x7fffffff;
stack<char>z;
vector<double>v;
double temp;
string s,s2,s3;
bool f2;
int t2;
bool num(char x)
{
if(x<='9' && x>='0')
{
return true;
}
return false;
}
bool start()
{
while(!z.empty())
{
z.pop();
}
s2="";
for(int i=0;i<s.length();i++)
{
if(num(s[i]))
{
s2+=s[i];
}
else
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
if(s[i]=='+')
{
while(!z.empty())
{
if(z.top()=='(')
{
break;
}
else
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
s2+=z.top();
z.pop();
}
}
z.push('+');
}
else if(s[i]=='-')
{
while(!z.empty())
{
if(z.top()=='(')
{
break;
}
else
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
s2+=z.top();
z.pop();
}
}
z.push('-');
}
else if(s[i]=='*')
{
while(!z.empty())
{
if(z.top()=='*' || z.top()=='/')
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
s2+=z.top();
z.pop();
}
else if(z.top()=='(' || z.top()=='+' || z.top()=='-')
{
break;
}
}
z.push('*');
}
else if(s[i]=='/')
{
while(!z.empty())
{
if(z.top()=='*' || z.top()=='/')
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
s2+=z.top();
z.pop();
}
else if(z.top()=='(' || z.top()=='+' || z.top()=='-')
{
break;
}
}
z.push('/');
}
else if(s[i]=='s'||s[i]=='S')
{
z.push('s');
if(s[i+3]!='(')
{
return false;
}
i+=2;
}
else if(s[i]=='A'||s[i]=='a')
{
z.push('a');
if(s[i+3]!='(')
{
return false;
}
i+=2;
}
else if(s[i]=='(')
{
z.push('(');
}
else if(s[i]==')')
{
while(!z.empty())
{
if(z.top()!='(')
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
s2+=z.top();
z.pop();
}
else
{
z.pop();
if(!z.empty())
{
if(z.top()=='a'||z.top()=='s')
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
s2+=z.top();
z.pop();
}
break;
}
break;
}
}
}
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
}
}
while(!z.empty())
{
if(z.top()!='(')
{
if(s2!="" && s2[s2.length()-1]!=' ')
{
s2+=' ';
}
s2+=z.top();
z.pop();
}
else
{
return false;
}
}
return true;
}
void change()
{
s3="";
for(int i=0;i<s2.length();i++)
{
if(s2[i]=='s')
{
s3+=" 根号! ";
}
else if(s2[i]=='a')
{
s3+=" 取绝对值! ";
}
else
{
s3+=s2[i];
}
}
return ;
}
bool calculate()
{
t2=0;
f2=false;
v.clear();
for(int i=0;i<s2.length();i++)
{
if(num(s2[i]))
{
if(f2)
{
t2*=10;
t2+=s2[i]-'0';
}
else
{
f2=true;
t2=s2[i]-'0';
}
}
else if(s2[i]==' ')
{
if(f2)
{
v.push_back(t2);
f2=false;
}
else
{
continue;
}
}
else if(s2[i]=='s')
{
if(!v.empty())
{
v.back()=sqrt(v.back());
}
else
{
return false;
}
}
else if(s2[i]=='a')
{
if(!v.empty())
{
if(v.back()<0)
{
v.back()=-v.back();
}
}
else
{
return false;
}
}
else if(s2[i]=='+')
{
if(v.size()>=2)
{
temp=v.back();
v.pop_back();
v.back()=temp+v.back();
}
else
{
return false;
}
}
else if(s2[i]=='-')
{
if(v.size()>=2)
{
temp=v.back();
v.pop_back();
v.back()=v.back()-temp;
}
else
{
return false;
}
}
else if(s2[i]=='/')
{
if(v.size()>=2)
{
temp=v.back();
v.pop_back();
v.back()=v.back()/temp;
}
else
{
return false;
}
}
else if(s2[i]=='*')
{
if(v.size()>=2)
{
temp=v.back();
v.pop_back();
v.back()=v.back()*temp;
}
}
}
return true;
}
int main()
{
while(cin>>s)
{
if(start())
{
change();
cout<<endl<<"后缀表达式为:"<<s3<<endl;
if(calculate())
{
cout<<endl<<"最后的结果是:"<<v[0]<<endl;
}
else
{
cout<<"You have input errors!"<<endl;
}
}
else
{
cout<<"You have input errors!"<<endl;
}
}
return 0;
}