中缀表达式转后缀表达式,算法基础
1、假设输入的表达式本身是合法的,假设只有 + * ( ) 四个运算符
2、+优先级最低,( 优先级最高,然后 ) 然后 *
3、获取输入,如果是操作数,则直接输出;如果是操作符,则从栈弹出操作符直到出现 ( 或者比该操作符优先级低的操作符,然后该操作符入栈
4、只有出现 ) 时,才弹出 (
5、如果弹出的是 ( 则不输出,如果是其他操作符,则输出
6、输入结束,弹出栈元素到输出–参考5,直至栈空
#include
#include
typedef int ElementType;
#include "_Stack.h"
#include "_Stack.c"
#define SMALL_LEFT ( 40 )
#define SMALL_RIGHT ( 41 )
void Error( char* ErrorMsg )
{
printf( "%s", ErrorMsg );
exit( 1 );
}
void FatalError( char* ErrorMsg )
{
printf( "%s", ErrorMsg );
exit( 2 );
}
int main()
{
FILE *fp, *fpin;
Stack S;
ElementType c, ch;
if( ( fp = fopen( "infix.txt", "r" ) ) == NULL )
{
printf( "Cannot open this file.\n" );
return 0;
}
if( ( fpin = fopen( "postfix.txt", "w+" ) ) == NULL )
{
printf( "Cannot open this file.\n" );
return 0;
}
S = CreateStack();
while( !feof ( fp ) )
{
c = fgetc( fp );
if( c != '+' && c != '*' && c != SMALL_LEFT && c != SMALL_RIGHT )
{
fputc( c, fpin );
}
else
{
if( c == '+' )
{
while( !IsEmpty( S ) )
{
ch = Top( S );
if( ch != '(' )
{
Pop( S );
fputc( ch, fpin );
}
else
{
break;
}
}
Push( c, S );
}
if( c == ')' )
{
while( !IsEmpty( S ) )
{
ch = Top( S );
if( ch != '(' )
{
Pop( S );
fputc( ch, fpin );
}
if( ch == '(' )
{
Pop( S );
break;
}
}
}
if( c == '*' || c == '(')
{
Push( c, S );
}
}
}
while( !IsEmpty( S ) )
{
ch = Top( S );
fputc( ch, fpin );
Pop( S );
}
return 0;
}
输入样例: a+b*c+(d*e+f)*g
输出样例: abc*+de*f+g*+