
bool in(char c)
{
if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')'|| c == '#')
return true;
else
return false;
}
char operate(char c1,char tha, char c2)
//注意c1\c2顺序要与表达式一致
{
switch(tha)
{
case '+':return (c1 - '0')+(c2 - '0');
case '-':return (c1 - '0')-(c2 - '0');
case '*':return (c1 - '0')*(c2 - '0');
}
return (c1 - '0')/(c2 - '0');
}
char precede(char a,char b)
{
char f;
switch(b)
{
case '+':
case '-':if(a == '(' || a == '#')
f = '<';
else
f = '>';
break;
case '*':
case '/':if(a == ')'|| a == '*' || a == '/')
f = '>';
else
f = '<';
break;
case '(':if(a == ')')
{
cout << "括号不符合规则!" << endl;
exit(-1);
}
else
f = '<';
break;
case ')':switch(a)
{
case '(':f = '=';
break;
case '#':
{
cout << "缺失左括号" << endl;
exit(-1);
}
default:f = '>';
}
break;
case '#':switch(a)
{
case '(':
cout << "缺失右括号" << endl;
exit(-1);
case '#':f = '=';
break;
default: f = '>';
}
}
return f;
}
char EvalueateExpression()
{
STACK OPND,OPTR;
initial(&OPND);
initial(&OPTR);
push_stack(&OPTR,'#');
char c,x,a,b;
char s[20];
c = getchar();
GetTop(&OPTR,s);
x = s[0];
while (c != '#' || x != '#')
{
if(in(c))
{
switch(precede(x,c))
{
case '<':
push_stack(&OPTR,c);
cout << "c= " << c << " x= " << x <<endl;
c =getchar();
traverse(&OPND);
traverse(&OPTR);
break;
case '=':
pop_stack(&OPTR,s);
cout << "c= " << c << " x= " << x <<endl;
c = getchar();
traverse(&OPND);
traverse(&OPTR);
break;
case '>':
pop_stack(&OPTR,s);
x = s[0];
pop_stack(&OPND,s);
b = s[0];
pop_stack(&OPND,s);
a = s[0];
push_stack(&OPND,operate(a,x,b));
traverse(&OPND);
traverse(&OPTR);
cout << "c= " << c << " x= " << x <<endl;
}
}
else if(c >= '0' && c <= '9')
{
push_stack(&OPND,c);
cout << "c= " << c << " x= " << x <<endl;
c = getchar();
}
else
{
cout << "出现非法字符!" << endl;
cout << "c= " << c << " x= " << x <<endl;
exit(-1);
}
GetTop(&OPTR,s);
x = s[0];
cout << "c= " << c << " x= " << x <<endl;
}
traverse(&OPND);
traverse(&OPTR);
pop_stack(&OPND,s);
x = s[0];
if(!empty_stack(&OPND))
{
cout << "表达式有问题!" << endl;
exit(-1);
}
return x;
}
int main()
{
cout << "输入一个表达式(结果在-127-128之间|中间数在0-9之间): ";
cout << int(EvalueateExpression()) <<endl;
return 0;
}`