波兰式转换为逆波兰式.docxVIP

  • 7
  • 0
  • 约7.6千字
  • 约 8页
  • 2017-08-20 发布于北京
  • 举报
波兰式转换为逆波兰式(中缀表达式转换为后缀表达式) 逆 HYPERLINK /view/21934.htm \t _blank 波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫 HYPERLINK /view/339689.htm \t _blank 后缀表达式(将运算符写在 HYPERLINK /view/420846.htm \t _blank 操作数之后) 一、定义 一个 HYPERLINK /view/420676.htm \t _blank 表达式E的后缀形式可以如下定义: (1)如果E是一个 HYPERLINK /view/296689.htm \t _blank 变量或 HYPERLINK /view/346799.htm \t _blank 常量,则E的 HYPERLINK /view/2973716.htm \t _blank 后缀式是E本身。 (2)如果E是E1 op E2形式的 HYPERLINK /view/420676.htm \t _blank 表达式,这里op是如何二元操作符,则E的 HYPERLINK /view/2973716.htm \t _blank 后缀式为E1E2 op,这里E1和E2分别为E1和E2的后缀式。 (3)如果E是(E1)形式的 HYPERLINK /view/420676.htm \t _blank 表达式,则E1的 HYPERLINK /view/2973716.htm \t _blank 后缀式就是E的后缀式。 如:我们平时写a+b,这是中缀表达式,写成 HYPERLINK /view/339689.htm \t _blank 后缀表达式就是:ab+ (a+b)*c-(a+b)/e的 HYPERLINK /view/339689.htm \t _blank 后缀表达式为: (a+b)*c-(a+b)/e →((a+b)*c)((a+b)/e)- →((a+b)c*)((a+b)e/)- →(ab+c*)(ab+e/)- →ab+c*ab+e/- 二、算法实现 将一个普通的中序 HYPERLINK /view/420676.htm \t _blank 表达式转换为 HYPERLINK /view/552648.htm \t _blank 逆波兰表达式的一般算法是: 首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆 HYPERLINK /view/21934.htm \t _blank 波兰式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤: (1)若取出的字符是 HYPERLINK /view/420846.htm \t _blank 操作数,则分析出完整的运算数,该操作数直接送入S2栈 (2)若取出的字符是 HYPERLINK /view/425996.htm \t _blank 运算符,则将该运算符与S1栈栈顶元素比较,如果该 HYPERLINK /view/262524.htm \t _blank 运算符优先级大于S1栈栈顶 HYPERLINK /view/425996.htm \t _blank 运算符优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。 (3)若取出的字符是“(”,则直接送入S1栈栈顶。 (4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个 HYPERLINK /view/346791.htm \t _blank 出栈,依次送入S2栈,此时抛弃“(”。 (5)重复上面的1~4步,直至处理完所有的输入字符 (6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个 HYPERLINK /view/346791.htm \t _blank 出栈,依次送入S2栈。 完成以上步骤,S2栈便为逆 HYPERLINK /view/21934.htm \t _blank 波兰式输出结果。不过S2应做一下逆序处理。便可以按照逆 HYPERLINK /view/21934.htm \t _blank 波兰式的计算方法计算了! 三、作用 实现逆 HYPERLINK /view/21934.htm \t _blank 波兰式的算法,难度并不大,但为什么要将看似简单的中序 HYPERLIN

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档