中缀转后缀 c++实现
2013-08-26 16:50
381 查看
表达式的表示形式有中缀、前缀和后缀3中形式。中缀表达式按操作符的优先级进行计算(后面代码实现只包括+、-、*、\,小括号),即数学运算。后缀表达式中只有操作数和操作符。操作符在两个操作数之后。它的计算规则非常简单,严格按照从左到右的次序依次执行每一个操作。每遇到一个操作符,就将前面的两个数执行相应的操作。
由后缀表达式计算中缀表达式原理:计算机处理后缀表达式求值问题是比较方便的,即将遇到的操作数暂存于一个操作数栈中,凡是遇到操作数,便从栈中pop出两个操作数,并将结果存于操作数栈中,直到对后缀表达式中最后一个操作数处理完,最后压入栈中的数就是后最表达式的计算结果。
中缀表达式转换为等价的后缀表达式
中缀表达式不方便与计算机处理,通常要讲中缀表达式转换为一个与之等价的后缀表达式。等价是指两个表达式的计算顺序和计算结果完全相同。
中缀表达式:0.3/(5*2+1)#
的等价后缀表达式是:0.3 5 2 * 1 + /#
仔细观察这两个等价的表达式可知,操作数的出现次序是相同的,但运算符的出现次序是不同的。在后缀表达式中,运算符的出现次序是实际进行操作的次序;在中缀表达式中,由于受到操作符的优先级和括号的影响,操作符出现次序与实际进行操作的次序很可能是不一样的。
算法描述:
将中缀表达式转换为等价的后缀表达式的过程要使用一个操作符栈放括号,具体可以按照下面的方式进行。
(1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则直接将它们写入后缀表达式中,用特殊字符将数值分离开(比如'#1')。
(2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。
(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:(括号的优先级最低)
1、当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入后缀表式,并弹出该栈顶元素,反复执行直到当前操作符的优先级大于栈顶元素的优先级;
2、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。
(4)重复上述步骤直到遇到中缀表达式的结束符标记“#”,弹出栈中的所有元素并放入后缀表达式中,转换结束。
前面是转载的。
下面上C++代码:
由后缀表达式计算中缀表达式原理:计算机处理后缀表达式求值问题是比较方便的,即将遇到的操作数暂存于一个操作数栈中,凡是遇到操作数,便从栈中pop出两个操作数,并将结果存于操作数栈中,直到对后缀表达式中最后一个操作数处理完,最后压入栈中的数就是后最表达式的计算结果。
中缀表达式转换为等价的后缀表达式
中缀表达式不方便与计算机处理,通常要讲中缀表达式转换为一个与之等价的后缀表达式。等价是指两个表达式的计算顺序和计算结果完全相同。
中缀表达式:0.3/(5*2+1)#
的等价后缀表达式是:0.3 5 2 * 1 + /#
仔细观察这两个等价的表达式可知,操作数的出现次序是相同的,但运算符的出现次序是不同的。在后缀表达式中,运算符的出现次序是实际进行操作的次序;在中缀表达式中,由于受到操作符的优先级和括号的影响,操作符出现次序与实际进行操作的次序很可能是不一样的。
算法描述:
将中缀表达式转换为等价的后缀表达式的过程要使用一个操作符栈放括号,具体可以按照下面的方式进行。
(1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则直接将它们写入后缀表达式中,用特殊字符将数值分离开(比如'#1')。
(2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。
(3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:(括号的优先级最低)
1、当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入后缀表式,并弹出该栈顶元素,反复执行直到当前操作符的优先级大于栈顶元素的优先级;
2、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。
(4)重复上述步骤直到遇到中缀表达式的结束符标记“#”,弹出栈中的所有元素并放入后缀表达式中,转换结束。
前面是转载的。
下面上C++代码:
相关文章推荐
- #C++实现先中缀转后缀的算术表达式计算
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- C/C++的中缀转后缀并求值的实现
- 中缀表达式到后缀表达式的转换C++实现
- 利用栈实现中缀转换为后缀(P67,数据结构与算法分析Java)
- java实现 中缀转后缀
- java实现中缀转后缀,后缀计算值
- 【中缀转换成后缀或者前缀的思想、过程以及算法实现】
- 算术表达式求值(中缀转后缀,后缀求值,java 栈实现)
- Java实现:利用栈实现中缀到后缀的转换
- 中缀表达式转后缀表达式(逆波兰式)的C++代码
- windows下,c /c++实现磁盘扫描,结合配置文件,读取特定后缀文件目录代码
- C++实现计算器功能(包括计算含未知量的式子),输出后缀表达式
- windows下,c /c++实现磁盘扫描,结合配置文件,读取特定后缀文件目录代码
- 从文件夹中读取子文件夹内带有指定后缀如.bmp文件的C++实现,并读取子文件夹后缀数字
- C++实现中缀表达式转后缀表达式并求值
- windows下,c /c++实现磁盘扫描,结合配置文件,读取特定后缀文件目录代码
- 栈练习之C语言中实现中缀转后缀表达式
- 中缀表达式转后缀表达式(用于求字符串表达式值)(js栈和队列的实现是通过数组的push和unshift方法插值,pop方法取值)