带你了解Java数据结构和算法之前缀,中缀和后缀表达式

带你了解Java数据结构和算法之前缀、中缀和后缀表达式

1. 前缀表达式(Prefix Expression)

前缀表达式是指运算符位于操作数之前的表达式,也被称为波兰式。前缀表达式的优点在于,每个运算符的优先级都可以通过括号来明确,不需要考虑运算符的优先级。同时,整个表达式的意义也可以很清晰地传达。

举个例子,下面是一个前缀表达式:

+ * 4 5 6  // 等价于 (4 * 5) + 6 = 26

解释一下这个表达式,首先遇到的是加号。因为加号是二元运算符,所以要取两个操作数,也就是向后读两个数字。读到 6 后,算法要回溯并读取运算符。这个运算符是乘号,同样是二元运算符,所以要取两个操作数。这两个操作数是4和5,因此表达式的意义应该是 (4 * 5) + 6。最终结果是 26。

2. 中缀表达式(Infix Expression)

中缀表达式是一般我们所见到的形式,即运算符位于操作数之间。例如,下面是一个中缀表达式:

4 * 5 + 6  // 等价于 (4 * 5) + 6 = 26

中缀表达式表达式的缺点在于,运算符的优先级不明确。因此,需要用括号来明确优先级。例如:

4 * (5 + 6)  // 等价于 4 * 11 = 44

3. 后缀表达式(Postfix Expression)

后缀表达式也叫做逆波兰式(Reverse Polish Notation),是一种将运算符置于操作数之后的表达式。

举个例子,下面是一个后缀表达式:

4 5 * 6 +  // 等价于 (4 * 5) + 6 = 26

读取后缀表达式很简单:从左到右读取每个元素,如果是数字,则加入栈中;如果是运算符,则取出栈顶的两个元素,进行运算,并将运算结果入栈。上述的后缀表达式的算法流程如下:

读取4,入栈
读取5,入栈
读取*,从栈中取出5和4,计算4*5=20,将结果入栈
读取6,入栈
读取+,从栈中取出6和20,计算6+20=26,将结果入栈

最终,栈中只剩下一个元素,它就是整个表达式的计算结果。

4. 注意事项

  • 中缀表达式需要使用括号来明确优先级。而前缀和后缀表达式则不需要。
  • 在进行后缀表达式的计算时,必须遵循运算符对应的先后顺序。例如,在上述的后缀表达式中,运算符 * 的优先级要高于 + 的优先级。

5. 示例说明

示例1

下面是一个中缀表达式:

3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3

这个表达式包含了加、乘、除、括号和幂次运算。为了将其转换成后缀表达式,需要定义每个运算符的优先级。

在这个表达式中,按照运算优先级排序,幂次运算最高,其次是括号,然后是乘除法,最后是加减法。根据这个优先级表,将中缀表达式转成后缀表达式,结果如下:

3 4 2 * 1 5 - 2 3 ^ ^ / +

将这个后缀表达式代入计算器中,最终结果是 3.0001220703125。

示例2

下面是一个前缀表达式:

- + * AB - CD / E F

这个表达式用运算符表示法会变成:

(((A*B)+(C-D))/E)-F

其中,运算符的优先级通过使用括号来明确。这个表达式的值为 (A×B)+(C - D)/ E - F。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:带你了解Java数据结构和算法之前缀,中缀和后缀表达式 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构学习之二叉树

    Java数据结构学习之二叉树 什么是二叉树 二叉树是一种树形数据结构,他的每个节点最多有两个子节点,分别称为左子节点和右子节点。如果一个节点没有子节点,则成为叶子节点。二叉树具有以下性质: 每个节点最多有两个子节点 左子树和右子树是二叉树 二叉树可以为空 二叉树的遍历 为了遍历一棵树,我们可以采用两种算法: 深度优先遍历 深度优先遍历的思路是:从根节点出发,…

    数据结构 2023年5月17日
    00
  • 基于python实现模拟数据结构模型

    实现一个模拟数据结构模型的过程需要考虑以下几个步骤: 确定数据结构类型,例如链表、栈、队列、二叉树等。 设计数据结构的具体实现方法,例如链表可采用节点、指针的方式实现,栈可以使用列表或数组实现,队列可使用循环队列实现等。 使用Python编写数据结构相关的类、方法、函数等,确保代码的可读性、灵活性和易维护性。 使用示例数据测试数据结构的各种操作,例如插入、删…

    数据结构 2023年5月17日
    00
  • C语言数据结构之 折半查找实例详解

    C语言数据结构之 折半查找实例详解 什么是折半查找? 折半查找是一种在有序数组中查找某个特定元素的算法。其基本思想是将查找的值与数组的中间元素比较,如果比中间元素小,则在数组的左半部分查找;如果比中间元素大,则在数组的右半部分查找,直到找到该元素或查找范围为空。 折半查找算法的流程 确定要查找的数组arr和其元素个数n,以及要查找的元素value。 设定左边…

    数据结构 2023年5月17日
    00
  • C语言超详细讲解数据结构中的线性表

    C语言超详细讲解数据结构中的线性表完整攻略 线性表的概念和基本操作 线性表是指由同类型的数据元素构成的有限序列。即每个数据元素只有一个前驱和一个后继。线性表通常用于表示一维数组、列表、队列等数据结构。 线性表的基本操作包括: 初始化操作:创建一个空的线性表。 插入操作:在线性表中插入一个元素。 删除操作:删除线性表中的一个元素。 查找操作:查找线性表中是否存…

    数据结构 2023年5月17日
    00
  • 带头节点的单链表的思路及代码实现

    带头节点的单链表的思路及代码实现(JAVA) 一、什么是的单链表 ①标准定义 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。) 以上是标准定义不太好让人对单链表有直观…

    算法与数据结构 2023年4月17日
    00
  • Go 数据结构之堆排序示例详解

    Go 数据结构之堆排序示例详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构,它满足下列性质: 堆中每个节点的关键字都不大于(或不小于)其子节点的关键字。 堆中,根节点(顶端)是最小或最大元素。 堆实际上是一个完全二叉树,因此可以用数组实现。对于下标为i的节点,其左子节点为2i,右子节点为2i+1,父节点为i/2。 堆分为最大堆和最小堆。在最大堆中,父…

    数据结构 2023年5月17日
    00
  • 【ACM数论】和式变换技术,也许是最好的讲解之一

    在做数论题时,往往需要进行和式变换,然后变换成我们可以处理的和式,再针对和式做筛法、整除分块等操作。 本文将介绍一些常见的和式变换技术。 以下出现的概念大部分为个人总结,未必是学术界/竞赛界的统一说法,有不严谨的地方请谅解。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流…

    算法与数据结构 2023年4月17日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部