栈的应用(中缀表达式转后缀表达式–逆波兰)


中缀表达式转后缀表达式,算法基础
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*+


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注