#include
#include
#include
using namespace std;
char Precede(char a,char b);
int Operator(int a,char o,int b);
bool Decide(char c);
int main()
{
cout<<"the end of your input should be '#'"<<endl;
stack operators;
stack numbers;
operators.push('#');
char c;
c=getchar();
int temp=0;
while(c!='#'||operators.top()!='#')
{
if(c>='0'&&c<='9')
{
temp=temp*10+c-'0';
c=getchar();
}
else if(Decide(c))
{
if(temp!=0)
{
numbers.push(temp);
temp=0;
}
switch(Precede(operators.top(),c))
{
case '<':
operators.push(c);
c=getchar();
break;
case '=':
operators.pop();
c=getchar();
break;
case '>':
int b=numbers.top();//注意a、b的弹出顺序
numbers.pop();
char o=operators.top();
operators.pop();
int a=0;
if(!numbers.empty())
{
a=numbers.top();
numbers.pop();
}
numbers.push(Operator(a,o,b));
break;
}
}
else
cout<<"your input contains error char!"<<endl;
}
cout<<"the result is "<<numbers.top()<<endl;
return 0;
}
char Precede(char a,char b)
{
int j[2];
char table[7][7]=
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','e'},
{'>','>','>','>','e','>','>'},
{'<','<','<','<','<','e','='}
};
for(int i=0;i<2;i++)
{
char c;
if(i==0)
{
c=a;
}
else if(i==1)
{
c=b;
}
switch(c)
{
case '+':j[i]=0;break;
case '-':j[i]=1;break;
case '*':j[i]=2;break;
case '/':j[i]=3;break;
case '(':j[i]=4;break;
case ')':j[i]=5;break;
case '#':j[i]=6;break;
}
}
return table[j[0]][j[1]];
}
int Operator(int a,char o,int b)
{
switch(o)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
bool Decide(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return true;
else
return false;
}