#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef int Status;
typedef struct StackNode
{
char date;
struct StackNode *next;
}StackNode,*LinkStack;
Status Initstack(LinkStack &S)
{
S=NULL;
return true;
}
Status xiaohui(LinkStack &S)
{
delete S;
return true;
}
Status Push(LinkStack &S,char e)
{
LinkStack p;
p = new StackNode;
p->date = e;
p->next = S;
S = p;
return true;
}
Status Pop(LinkStack &S,char &e)
{
LinkStack p;
if(S==NULL)
return false;
e = S->date;
p=S;
S=S->next;
delete p;
return true;
}
char GetTop(LinkStack S)
{
if(S!=NULL)
return S->date;
}
Status In(char a)
{
if(a == '+' || a == '-' || a == '*' || a == '/'||a == '#'||a == '('||a == ')')
return true;
else
return false;
}
int Operate(char a, char b, char c)
{
if(b == '+')
return ((a-'0')+(c-'0')+'0');
else if(b == '-')
return ((a-'0')-(c-'0')+'0');
else if(b == '*')
return ((a-'0')*(c-'0')+'0');
else if(b == '/')
return ((a-'0')/(c-'0')+'0');
}
char Precede(char a, char b)
{
if(a == '+')
{
if(b == '+')
return '>';
else if(b == '-')
return '>';
else if(b == '*')
return '<';
else if(b == '/')
return '<';
else if(b == '(')
return '<';
else if(b == ')')
return '>';
else if(b == '#')
return '>';
}
else if(a == '-')
{
if(b == '+')
return '>';
else if(b == '-')
return '>';
else if(b == '*')
return '<';
else if(b == '/')
return '<';
else if(b == '(')
return '<';
else if(b == ')')
return '>';
else if(b == '#')
return '>';
}
else if(a == '*')
{
if(b == '+')
return '>';
else if(b == '-')
return '>';
else if(b == '*')
return '>';
else if(b == '/')
return '>';
else if(b == '(')
return '<';
else if(b == ')')
return '>';
else if(b == '#')
return '>';
}
else if(a == '/')
{
if(b == '+')
return '>';
else if(b == '-')
return '>';
else if(b == '*')
return '>';
else if(b == '/')
return '>';
else if(b == '(')
return '<';
else if(b == ')')
return '>';
else if(b == '#')
return '>';
}
else if(a == '(')
{
if(b == '+')
return '<';
else if(b == '-')
return '<';
else if(b == '*')
return '<';
else if(b == '/')
return '<';
else if(b == '(')
return '<';
else if(b == ')')
return '=';
else if(b == '#')
return ' ';
}
else if(a == ')')
{
if(b == '+')
return '>';
else if(b == '-')
return '>';
else if(b == '*')
return '>';
else if(b == '/')
return '>';
else if(b == '(')
return ' ';
else if(b == ')')
return '>';
else if(b == '#')
return '>';
}
else if(a == '#')
{
if(b == '+')
return '<';
else if(b == '-')
return '<';
else if(b == '*')
return '<';
else if(b == '/')
return '<';
else if(b == '(')
return '<';
else if(b == ')')
return ' ';
else if(b == '#')
return '=';
}
}
char EvaluateExpression()
{
LinkStack OPND,OPTR;
Initstack(OPND);
Initstack(OPTR);
Push(OPTR,'#');
char ch;
cin>>ch;
while(ch!='#'||GetTop(OPTR)!='#')
{
if(!In(ch))
{
Push(OPND,ch);
cin>>ch;
}
else
{
switch(Precede(GetTop(OPTR),ch))
{
case '<':
{
Push(OPTR,ch);
cin>>ch;
break;
}
case '>':
{
char a,b;
char theta;
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
case '=':
{
char x;
Pop(OPTR,x);
cin>>ch;
break;
}
}
}
}
return GetTop(OPND) ;
}
int main()
{
cout<<"请输入表达式,以#结尾"<<endl;
cout<<"括号请用英文输入法下的括号"<<endl;
char sum=EvaluateExpression();
cout<<sum-'0'<<endl;
return 0;
}