用栈将中缀表达式转化为后缀表达式

中缀表达式就是我们通常使用的表达式。
后缀表达式,又称为逆波兰表达式,所有操作符置于操作数的后面,且 不需要括号来标示操作符的优先级
举个例子:中缀表达式为a*(b+c),其对应的后缀表达式为abc+*。

那么, 后缀表达式如何 计算呢?用栈。以后缀表达式abc+*为例:
从左向右依次扫描。
操作数入栈,a入栈,b入栈,c入栈;遇到运算符+,取出栈顶的两个元素进行计算,此时为b+c(设结果为d),再将d压入栈内,此时栈内的元素是a、d;遇到运算符*,取出a、d,计算a*d(设结果为e),再将e压入栈内。
扫描结束,此时站内的元素e为整个表达式的值。

下一个问题,如何把中缀表达式转化为后缀表达式呢?还是用栈。这个栈是运算符号栈,从栈底到栈顶,总是保持运算符号优先级 严格递增
设最后 储存后缀表达式的数组为A运算符号栈S。从左向右依次扫描中缀表达式。

1.若扫描到操作数,直接存入数组A。

2.若扫描到运算符,如果S为空,入栈;如果S非空,比较当前运算符与栈顶运算符的优先级,若高于,则入栈,若等于或低于,则S栈顶符号出栈,直到栈空或栈顶符号优先级低于当前符号,出栈的符号存入数组A,当前符号入栈。

3.若扫描到括号,入栈;直到扫描到另一半括号,此时,S的元素依次出栈存入数组A,直到遇到之前压入的括号,并丢弃之。

4.扫描完最后一个操作数,将S的元素依次出栈存入数组A。

扫描结束,此时数组A存储了相应的后缀表达式。

你可能感兴趣的:(数据结构与算法,栈,中缀表达式,后缀表达式,OpenJudge)