如何把中缀表达式变成后缀表达式
//规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数出栈,进而运算,运算结果进栈,一直到最终获///得结果
/*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+- 后缀式子出现
发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。
如果你习惯拉他的运算方法。计算的时候也就是从两个操作数的前面
或者后面找运算符。而不是中间找,那么也就直接可以口算拉
本文来自博客园,作者:赫凯,转载请注明原文链接:https://www.cnblogs.com/heKaiii/p/15491365.html

浙公网安备 33010602011771号