使用栈来将中缀式转换为后缀式,在对后缀式求值。
代码:
/*
栈的使用:中缀表达式转换为后缀表达式
*/
#include <iostream>
#include <stack>
using namespace std;
int Operate( char a, char Operator, char b );
int isp( char Operator )
{
// 进栈后符号的优先级
int Priority;
switch ( Operator )
{
case '#': Priority = 0; break;
case '(': Priority = 1; break;
case '+':
case '-': Priority = 2; break;
case '*':
case '/': Priority = 3; break;
case ')': Priority = 4; break;
default: printf( "Wrong" ); break;
}
return Priority;
}
int icp( char Operator )
{
// 进栈前符号的优先级
int Priority;
switch ( Operator )
{
case '#': Priority = 0; break;
case '(': Priority = 4; break;
case '+':
case '-': Priority = 2; break;
case '*':
case '/': Priority = 3; break;
case ')': Priority = 1; break;
default: printf( "Wrong" ); break;
}
return Priority;
}
bool IsOperator( char a )
{
// 判断字符是否为运算符
switch ( a )
{
case '#':
case '(':
case '+':
case '-':
case '*':
case '/':
case ')': return true; break;
default: return false; break;
}
}
double EvaluateExpression( char exp[] )
{
/*
假设输入表达式合法,且输入表达式中操作数为 0~9,操作符只含二元操作符
exp为表达式
*/
int i = 0;
char Input;
stack<char> Operator, Operand;
Operator.push( exp[i++] );
Input = exp[i++];
while ( Input != '#' || Operator.top( ) != '#' )
{
if ( !IsOperator( Input ) )
{
Operand.push( Input );
Input = exp[i++];
}
else
if ( isp( Operator.top( ) ) > icp( Input ) )
{
// 栈顶符号优先级大进行运算
char a, b, c;
c = Operand.top( ); Operand.pop( );
b = Operator.top( ); Operator.pop( );
a = Operand.top( ); Operand.pop( );
Operand.push( Operate( a, b, c ) );
}
else
if ( isp( Operator.top( ) ) < icp( Input ) )
{
// 栈顶符号优先级小,符号压入栈
Operator.push( Input );
Input = exp[i++];
}
else
{
char a, b, c;
if ( Input == ')' )
{
Operator.pop( );
Input = exp[i++];
}
else
{
c = Operand.top( ); Operand.pop( );
b = Operator.top( ); Operator.pop( );
a = Operand.top( ); Operand.pop( );
Operand.push( Operate( a, b, c ) );
}
}
}
return Operand.top( ) - '0';
}
int Operate( char a, char Operator, char b )
{
int result = 0;
int left, right;
left = a - '0';
right = b - '0';
switch ( Operator )
{
case '+': result = left + right; break;
case '-': result = left - right; break;
case '*': result = left * right; break;
case '/': result = left / right; break;
default: printf( "Wrong" ); break;
}
return result + '0';
}
int main( )
{
int ans;
int len;
char exp[100];
printf( "Test: " );
scanf( "%s", exp );
// 对输入表达式进行处理
len = strlen( exp );
exp[len + 1] = '#';
exp[len + 2] = '\0';
for ( int i = len; i > 0; --i )
exp[i] = exp[i - 1];
exp[0] = '#';
ans = EvaluateExpression( exp );
printf( "%s = %d\n", exp, ans );
return 0;
}