中缀表达式转化为后缀表达式

题目:

中缀表达式转化为后缀表达式

例如:

1+(2-3)*4+7/5         ----->       123-4*+75/+

思路分析:

1、首先要清楚中缀表达式转化我后缀表达式的规则:

1)遇到数字输出,否则进栈。

2)遇到有右括号匹配栈里的左括号,输出栈里的内容

3)遇到比自己比栈里的运算符优先级高,入栈

4)遇到比自己比栈里的运算符优先级低,将栈里的运算符出栈

代码

#include 
#include 
#include 

using namespace std;

int Compare(char n_ope);
string middle_to_final(string s1);

int main(int argc,char* argv[])
{
	string test = "1+(2-3)*4+7/5";
	string result = middle_to_final(test);
	cout << result << endl;
	return 0;
}


int Compare(char n_ope)
{
	if (n_ope == '+' || n_ope == '-') return 1;
	if (n_ope == '*' || n_ope == '/') return 2;
	if (n_ope == '(') return 0;
	return -1;
}

/*
转换规则:
1.遇到数字输出,否则进栈。
2.遇到有右括号匹配栈里的左括号,输出栈里的内容
3.遇到比自己比栈里的运算符优先级高,入栈
4.遇到比自己比栈里的运算符优先级低,将栈里的运算符出栈
*/

//只支持1-9的正整数,不支持2位数和负数
string middle_to_final(string s1)
{
	string result;
	stack st1;
	string::iterator it;
	for ( it= s1.begin(); it!= s1.end(); it++)
	{
		if ((*it) > '0' && (*it) < '9')
		{
			result.push_back(*it);
			continue;
		}//finish

		if ((*it) == '(')
		{
			st1.push(*it);
			continue;
		}//finish
		
		
		if ((*it) == ')')
		{
			while((st1.top())!='(')
			{
				result.push_back(st1.top());
				st1.pop();
			}
			st1.pop();
			continue;
		}
		else
		{
			//一定要判断st1是否为空,否则段错误
			while (!st1.empty() && Compare(st1.top()) >= Compare(*it))
			{
				result.push_back(st1.top());
				st1.pop();
			}
			st1.push(*it);
		}
	}
	
	while (!st1.empty())
	{
		result.push_back(st1.top());
		st1.pop();
	}
	

	return result;

}

待优化:

1、不支持负数和大于等于2位数的计算,做到这点可以考虑用字符数组替代string

你可能感兴趣的:(ACM,C/C++)