您的位置:首页 > 其它

如何把中缀表达式变成后缀表达式

2014-10-16 16:07 357 查看
//规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数出栈,进而运算,运算结果进栈,一直到最终获///得结果
/*empty() 堆栈为空则返回真
pop() 移除栈顶元素(不会返回栈顶元素的值)
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素[1]*/

#include "stdafx.h"
#include "iostream"
#include <stack>

using namespace std;

//函数功能:判断输入字符是加减还是乘除
//函数输入:字符
//函数返回:1或2或0
int prior(char op)
{
	if (op == '+' || op == '-')
		return 1;
	if (op == '*' || op == '/')
		return 2;
	return 0;
}

//函数功能:中缀转化为后缀
//函数输入:字符串地址
//函数返回:无
void houzhui(char* a)
{
	stack<char> op;    //定义一个栈

	//对字符串进行遍历
	while (*a != '\0')
	{
		//如果是数字就直接输出
		if (*a >= '0' && *a <= '9' || *a == '.')
			cout << *a;
		//如果不是就进行判断
		else
		{
			//如果是‘(’,就在栈里加入‘(’
			if (*a == '(')
				op.push('(');
			//继续往下走
			else
			{
				//如果是‘)’
				if (*a == ')')
				{
					//输出括号中的内容
					while (op.top() != '(')
					{
						cout << op.top();
						op.pop();
					}
					//删除‘(’
					op.pop();
				}

				//继续往下走
				else
				{
					//如果空了直接加去、进去
					if (op.empty())
						op.push(*a);
					//里面有东西
					else
					{
						//如果后进来的优先级大于栈顶元素的优先级,则加进去
						if (prior(*a) > prior(op.top()))
							op.push(*a);
						//如果后进来的元素优先级小于或者等于栈顶元素,那么就输出来直到栈为空,把后进来的元素加进去
						else
						{
							while (!op.empty() && prior(*a) <= prior(op.top()))
							{
								cout << op.top();
								op.pop();
							}
							op.push(*a);
						}
					}
				}
			}
		}
		a++;
	}
	//到最后如果还有元素都输出来
while (!op.empty())
	{
	cout << op.top();
	op.pop();
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	char *a =  "9+(3-1)*3+10/2";
	houzhui(a);
	getchar();
}
(以下内容转的)

35,15,+,80,70,-,*,20,/ //后缀表达方式

(((35+15)*(80-70))/20)=25 //中缀表达方式

/,*,+,35,15,-,80,70, 20 //前缀表达方式

人的思维方式很容易固定~~!正如习惯拉10进制。就对2,3,4,8,16

等进制不知所措一样~~!

人们习惯的运算方式是中缀表达式。而碰到前缀,后缀方式。。迷茫

其实仅仅是一种表达式子的方式而已(不被你习惯的方式)

我这里教你一种也许你老师都没跟你讲的简单转换方式

一个中缀式到其他式子的转换方法~~

这里我给出一个中缀表达式~

a+b*c-(d+e)

第一步:按照运算符的优先级对所有的运算单位加括号~

式子变成拉:((a+(b*c))-(d+e))

第二步:转换前缀与后缀表达式

前缀:把运算符号移动到对应的括号前面

则变成拉:-( +(a *(bc)) +(de))

把括号去掉:-+a*bc+de 前缀式子出现

后缀:把运算符号移动到对应的括号后面

则变成拉:((a(bc)* )- (de)+ )-

把括号去掉:abc*-de+- 后缀式子出现

发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。

如果你习惯拉他的运算方法。计算的时候也就是从两个操作数的前面

或者后面找运算符。而不是中间找,那么也就直接可以口算拉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: