它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。
举例:
(3 + 4) × 5 - 6 就是中缀表达式
- × + 3 4 5 6 前缀表达式
3 4 + 5 × 6 - 后缀表达式
中缀表达式(中缀记法)
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
前缀表达式(前缀记法、波兰式)
前缀表达式的运算符位于操作数之前。
前缀表达式的计算机求值:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
例如前缀表达式“- × + 3 4 5 6”:
(1) 从右至左扫描,将6、5、4、3压入堆栈;
(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
(4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
可以看出,用计算机计算前缀表达式的值是很容易的。
将中缀表达式转换为前缀表达式:
遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从右至左扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是右括号“)”,则直接压入S1;
(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最左边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。
例如,将中缀表达式“1+((2+3)×4)-5”转换为前缀表达式的过程如下:
举例:
(3 + 4) × 5 - 6 就是中缀表达式
- × + 3 4 5 6 前缀表达式
3 4 + 5 × 6 - 后缀表达式
中缀表达式(中缀记法)
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
前缀表达式(前缀记法、波兰式)
前缀表达式的运算符位于操作数之前。
前缀表达式的计算机求值:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
例如前缀表达式“- × + 3 4 5 6”:
(1) 从右至左扫描,将6、5、4、3压入堆栈;
(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
(4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
可以看出,用计算机计算前缀表达式的值是很容易的。
将中缀表达式转换为前缀表达式:
遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从右至左扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是右括号“)”,则直接压入S1;
(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最左边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。
例如,将中缀表达式“1+((2+3)×4)-5”转换为前缀表达式的过程如下:
扫描到的元素 | S2(栈底->栈顶) | S1 (栈底->栈顶) | 说明 |
5 | 5 | 空 | 数字,直接入栈 |
- | 5 | - | S1为空,运算符直接入栈 |
) | 5 | - ) | 右括号直接入栈 |
4 | 5 4 | - ) | 数字直接入栈 |
× | 5 4 | - ) × | S1栈顶是右括号,直接入栈 |
) | 5 4 | - ) × ) | 右括号直接入栈 |
3 | 5 4 3 | - ) × ) | 数字 |
+ | 5 4 3 | - ) × ) + | S1栈顶是右括号,直接入栈 |
2 | 5 4 3 2 | - ) × ) + | 数字 |
( | 5 4 3 2 + | - ) × | 左括号,弹出运算符直至遇到右括号 |
( | 5 4 3 2 + × | - | 同上 |
+ | 5 4 3 2 + × | - + | 优先级与-相同,入栈 |
1 | 5 4 3 2 + × 1 | - + | 数字 |
到达最左端 | 5 4 3 2 + × 1 + - | 空 | S1中剩余的运算符 |
后缀表达式(后缀记法、逆波兰式)
后缀表达式与前缀表达式类似,只是运算符位于操作数之后。
后缀表达式的计算机求值:
与前缀表达式类似,只是顺序是从左至右:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例如后缀表达式“3 4 + 5 × 6 -”:
(1) 从左至右扫描,将3和4压入堆栈;
(2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 将5入栈;
(4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
(5) 将6入栈;
(6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
将中缀表达式转换为后缀表达式:
与转换为前缀表达式相似,遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从左至右扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况,这句话不对,应该包括相等。以2*5/6为例);
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是左括号“(”,则直接压入S1;
(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最右边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。
例如,将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下:
扫描到的元素 | S2(栈底->栈顶) | S1 (栈底->栈顶) | 说明 |
1 | 1 | 空 | 数字,直接入栈 |
+ | 1 | + | S1为空,运算符直接入栈 |
( | 1 | + ( | 左括号,直接入栈 |
( | 1 | + ( ( | 同上 |
2 | 1 2 | + ( ( | 数字 |
+ | 1 2 | + ( ( + | S1栈顶为左括号,运算符直接入栈 |
3 | 1 2 3 | + ( ( + | 数字 |
) | 1 2 3 + | + ( | 右括号,弹出运算符直至遇到左括号 |
× | 1 2 3 + | + ( × | S1栈顶为左括号,运算符直接入栈 |
4 | 1 2 3 + 4 | + ( × | 数字 |
) | 1 2 3 + 4 × | + | 右括号,弹出运算符直至遇到左括号 |
- | 1 2 3 + 4 × + | - | -与+优先级相同,因此弹出+,再压入- |
5 | 1 2 3 + 4 × + 5 | - | 数字 |
到达最右端 | 1 2 3 + 4 × + 5 - | 空 | S1中剩余的运算符 |
因此结果为“1 2 3 + 4 × + 5 -”(注意需要逆序输出)。
摘自:http://www.java3z.com/cwbwebhome/article/article8/83542.html?id=4612
相关推荐
在将中缀表达式转换为前缀或后缀表达式时,通常需要遵循运算符优先级,并应用适当的转换规则。主要步骤包括:首先对所有的运算单位加上括号以明确优先级,然后将运算符移动到对应括号的前面或后面,最后去掉括号,...
将中缀表达式,转换为后缀表达式和前缀表达式,再分别计算转换后的表达式值,比较两个计算结果,判断转换正确性和计算正确性。 ·编程 (1)读入中缀表达式,表达式的数据可以是实型、整型; (2)转换为后缀表达式...
通过这个C++程序,我们可以将中缀表达式“2 + 3 * 4”转换为后缀表达式“2 3 4 * +”,并以这种方式有效地进行计算。这种方法在编译器和解释器的设计中具有广泛的应用,因为它提供了一种高效且易于理解的方式来解析...
在这个程序中,还实现了前缀表达式转换为后缀表达式,前缀表达式与中缀表达式类似,只是运算符位于操作数之前,如 `+ 2 3`。转换过程与中缀转后缀类似,只是在比较运算符优先级时需反向处理。 此外,程序支持了加、...
中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的...
将前缀表达式转换为后缀表达式,主要步骤包括: 1. 读取前缀表达式的第一个符号,如果它是操作数,直接写入结果串;如果是运算符,则将其压入栈中。 2. 遍历表达式中的下一个符号,如果是操作数,写入结果串;如果是...
本文将详细讨论如何将中缀表达式转换为后缀表达式(也称为逆波兰表示法),并结合“表达式树”这一概念进行阐述。在这个过程中,我们将使用VC6.0作为开发环境,但它同样适用于其他编程语言和环境。 首先,我们了解...
本篇文章将详细探讨如何通过C语言实现中缀表达式到后缀表达式转换的过程,并具体分析所涉及的关键算法与数据结构。 #### 中缀表达式与后缀表达式简介 - **中缀表达式**:我们日常使用的数学表达式,如 `3 + 4 * 2`...
"后缀表达式转换为前缀" 在编程语言中,后缀表达式是一种常见的表达式形式,它将运算符置于操作数之后,例如2 3 +。将后缀表达式转换为前缀表达式是编程语言基础课程中的一个重要题目,本文将详细介绍如何使用栈来...
然而,这种表达式在计算机处理时不如前缀或后缀表达式(也称为波兰表示法和逆波兰表示法)方便。本实验主要关注如何使用数据结构,特别是栈,来实现中缀表达式的求值。 首先,我们要了解栈是一种具有“后进先出”...
本文将深入探讨如何将中缀表达式转换为后缀表达式,并利用堆栈实现中缀表达式的求值。 首先,我们来看一下中缀表达式到后缀表达式的转换。这个过程主要通过两个步骤完成:遍历表达式并将其分为操作符和操作数,然后...
后缀表达式 (Postfix Notation),比如前所述的中缀表达式转换为后缀表达式为:"A B C * - D +"。 四、实例 中缀:a+b*c-(d+e) 后缀:((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+- 前缀:-( +(a *(bc)) +(de)) 把...
我们可以选择中缀表达式求值、转换为后缀表达式并求值或转换为前缀表达式并求值。每种选择都可以正确地计算出结果。 在附录中,我们提供了源代码,包括中缀表达式的存储结构、后缀表达式的转换算法和前缀表达式的...
2. 将中缀表达式转换为后缀表达式,这个过程涉及到处理括号、运算符的优先级,并将运算符推入栈中,直到遇到与之匹配的左括号或者运算符的优先级低于栈顶运算符时才出栈。 3. 对操作数进行加、减、乘、除、求模等...
不错 中缀表达式转后缀表达式 简单表达式运算
### 获取键盘输入一个中缀表达式,将它转换成后缀表达式,并输出结果 #### 知识点一:中缀表达式与后缀表达式的概念 - **中缀表达式**:通常我们书写的数学表达式就是中缀表达式,如`3 + 4 * 2`。在中缀表达式中,...
将一个表达式转为后缀表达式,用堆栈计算 中缀转后缀的过程中遇到数字直接输出,遇到符号则判断优先级。
通过定义合适的数据结构和基本的栈操作,结合中缀转后缀表达式的转换算法以及后缀表达式的计算逻辑,我们可以高效准确地对任意复杂的中缀表达式进行求值。这种方法不仅在计算机科学中有广泛的应用,而且也是理解和...
将中缀表达式转换为后缀表达式在计算机科学中具有重要应用价值,尤其是在编译器设计、计算器程序、数学表达式求值等领域。后缀表达式避免了括号的使用,简化了表达式的解析过程,提高了计算效率,尤其适合于使用栈...
cout转换的后缀表达式为:"; for(int i=output.length()-1;i>=0;i--)//9)求输出串的逆序。 cout[i]; return 0; } ``` 这个实现使用了栈来存储操作符,并使用一个循环来处理输入串。循环中,我们判断当前字符是否...