参考代码:
#include<iostream>
#include<stack>
using namespace std;
/**
return num2 opt num1
*/
int cal(int num1, int num2, char opt)
{
switch(opt)
{
case '+': return num2+num1;
case '-': return num2-num1;
case '*': return num2*num1;
case '/': return num2/num1;
}
cout<<"Error in line "<< __LINE__<<" file "<<__FILE__<<endl;
exit(1);
}
int getPriority(char opt)
{
switch(opt)
{
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
case '(': return 0;
case ')': return 0;
}
cout<<"Error in line "<< __LINE__<<" file "<<__FILE__<<endl;
exit(1);
}
bool comparePriority(char opt1, char opt2)
{
return getPriority(opt1)<=getPriority(opt2) ? true:false;
}
bool isDigital(const char p)
{
if(p>='0' && p<='9')
return true;
else
return false;
}
stack<int> Digit;
stack<char> Operator;
int calculator(const char *formula)
{
if(formula==NULL)
{
cout<<"Error in line "<< __LINE__<<" file "<<__FILE__<<endl;
exit(1);
}
const char *p = formula;
while(*p != '\0')
{
while(*p== ' ')
p++;
if(isDigital(*p)) //当前数据是字符
{
Digit.push(*p-'0');
p++;
}
else
{
if(Operator.empty())
{
Operator.push(*p);
p++;
}
else
{
char top=Operator.top();
if(*p!='(' && comparePriority(*p, top) )
{
int num1;
int num2;
int result;
while( top!='(' && comparePriority(*p, top) &&!Operator.empty())
{
num1=Digit.top();
Digit.pop();
num2=Digit.top();
Digit.pop();
result=cal(num1,num2,top);
Digit.push(result);
Operator.pop();
if(Operator.empty())
{
top=-1;
break;
}
else
top=Operator.top();
}
if(top=='(')
Operator.pop();
else
Operator.push(*p);
}
else
Operator.push(*p);
p++;
}
}
}
while(!Operator.empty())
{
int num1=Digit.top();
Digit.pop();
int num2=Digit.top();
Digit.pop();
char top=Operator.top();
int result=cal(num1,num2,top);
Digit.push(result);
Operator.pop();
}
return Digit.top();
}
int main()
{
char *p="(1+3)*(5-2)-9";
cout<<calculator(p)<<endl;
return 0;
}