中缀表达式转后缀表达式

转自:http://aaron67.cc/blog/acm%E6%A0%A1%E8%B5%9B2013-%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC/



对于表达式求值问题,首先想到的是利用逆波兰式。问题输入的是中缀表达式,于是程序分成两部分:先将输入转化成逆波兰式,然后再对逆波兰式求值。

由于问题输入的表达式中只包含括号和基本四则运算符,所以中缀表达式转化成逆波兰式的规则可以归纳为:

  • 依次处理中缀表达式中的每一个元素(运算符和操作数)
  • 如果当前元素是操作数或者是'(‘,则入栈
  • 如果当前元素是’*’或者是’/’,则在栈不空的前提下,不断出栈直到栈顶元素为'(‘或’+’或’-‘,然后当前元素入栈
  • 如果当前元素是’+’或者是’-‘,则在栈不空的前提下,不断出栈直到栈顶元素为'(‘,然后当前元素入栈
  • 如果当前元素是’)’,则在栈不空的前提下,不断出栈直到有一个'(‘出栈,然后丢弃当前元素
  • 上述操作的所有出栈元素,除'(‘外,都被依次添加到要生成的逆波兰式的末尾

对于逆波兰式求值,规则可以表述为:

  • 依次处理逆波兰表达式的每一个元素
  • 如果当前元素是操作数,则入栈
  • 如果当前元素是运算符,则连续两次出栈,先出栈的为右操作数,对这两个操作数做运算,然后将运算结果入栈
  • 处理完所有元素后,只要输入的是合法的逆波兰式,则栈中只剩一个元素,也就是表达式的值

你可能感兴趣的:(中缀表达式转后缀表达式)