表达式求值,假设操作数均为10以内的无符号整数。
int is_optr( char c )
{
return c == '+' || c == '-' || c == '*' || c == '/' ||
c == '(' || c == '#' || c == ')';
}
// 运算符优先级
char optr_priority[][7] = {
//+ - * / ( ) #
'>', '>', '<', '<', '<', '>', '>', // +
'>', '>', '<', '<', '<', '>', '>', // -
'>', '>', '>', '>', '<', '>', '>', // *
'>', '>', '>', '>', '<', '>', '>', // /
'<', '<', '<', '<', '<', '=', ' ', // (
'>', '>', '>', '>', ' ', '>', '>', // )
'<', '<', '<', '<', '<', ' ', '=' // #
};
// 获取运算符编号索引
int get_optr_idx( char c )
{
int idx;
switch( c )
{
case '+': idx = 0; break;
case '-': idx = 1; break;
case '*': idx = 2; break;
case '/': idx = 3; break;
case '(': idx = 4; break;
case ')': idx = 5; break;
case '#': idx = 6; break;
default: idx = -1; break;
}
return idx;
}
// 比较算符优先级
char precede( char c1, char c2 )
{
int idx1 = get_optr_idx( c1 );
int idx2 = get_optr_idx( c2 );
return optr_priority[idx1][idx2];
}
// 二元运算表达式求值
int eval( int n1, int n2, char op )
{
int res;
switch( op )
{
case '+':
res = n1 + n2;
break;
case '-':
res = n1 - n2;
break;
case '*':
res = n1 * n2;
break;
case '/':
res = n1 / n2;
break;
default:
break;
}
return res;
}
// 表达式求值
void eval_exp()
{
stack<char> ss_optr;
stack<int> ss_opnd;
ss_optr.push( '#' );
int ch = getchar();
int n1, n2;
char optr;
while( ch != '#' || ss_optr.top() != '#' )
{
if( ! is_optr( ch ) )
{
ss_opnd.push( ch - '0' );
ch = getchar();
}
else // is operator
{
char order = precede( ss_optr.top(), ch );
switch( order )
{
case '<':
ss_optr.push( ch );
ch = getchar();
break;
case '>':
optr = ss_optr.top();
ss_optr.pop();
n1 = ss_opnd.top(); ss_opnd.pop();
n2 = ss_opnd.top(); ss_opnd.pop();
ss_opnd.push( eval( n2, n1, optr ) );
break;
case '=': // ## or ()
ss_optr.pop();
ch = getchar();
break;
default:
break;
}
}
}
printf( "%d\n", ss_opnd.top() );
ss_opnd.pop();
}