带你了解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日

相关文章

  • Go 数据结构之堆排序示例详解

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

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之哈希算法实现

    Java 数据结构与算法系列精讲之哈希算法实现 什么是哈希算法? 哈希算法是一种能将任意长度的消息压缩到某一固定长度的消息摘要的算法。 通过哈希算法,我们可以将一个任意的大数据量压缩成一段固定长度的数据,这个数据的长度通常比较小,相对于原数据的大小来说,要小得多。哈希算法的压缩特性使得它经常用来进行信息摘要、数据校验、唯一识别等功能,可以很大程度上提高数据的…

    数据结构 2023年5月17日
    00
  • Redis数据结构原理浅析

    Redis数据结构原理浅析 Redis是一种高性能键值型数据库,支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。本文将对Redis各种数据结构的原理进行浅析。 字符串 Redis中的字符串数据结构不仅可以存储普通的字符,还可以存储整数和浮点数。字符串的最大长度为512MB。字符串结构的底层实现是从一个内存块开始存储的,该内存块的大小为实际存储的…

    数据结构 2023年5月17日
    00
  • Java数据结构之实现哈希表的分离链接法

    Java数据结构之实现哈希表的分离链接法 哈希表是一种非常常用的数据结构,它将数据存储在一个数组中,每个数组元素都存储着链表中的一个节点,这样可以实现高效的数据存储和查找操作。在哈希表中,我们可以通过哈希函数将关键字映射到数组中的特定位置。 但是,当哈希表的负载因子过高时,就会造成哈希冲突,这意味着两个或更多的关键字映射到了同一个数组位置。一种常见的解决方案…

    数据结构 2023年5月17日
    00
  • java实现队列queue数据结构详解

    Java实现队列(Queue)数据结构详解 什么是队列(Queue) 队列(Queue),是一种先进先出(First In First Out, FIFO)的数据结构,即最先进入队列的元素也会最先出队列。 队列具备两个基本操作:入队(enqueue)和出队(dequeue)。入队操作将元素加入到队列的尾部,出队操作将元素从队列头部取出并删除。 Java中的Q…

    数据结构 2023年5月17日
    00
  • 斜率优化入门

    前言 斜率优化是一种经典的单调队列优化类型,虽然它的名字很高大上,但是其思想内核非常简单,这篇博客就是用来帮助各位快速入门的 提示:本博客以单调队列的思想理解斜率优化 引入 dp 优化可以怎么分类? 数据结构维护决策点集的插入与查找 算法维护决策点集大小,取出无用决策点 而斜率优化 dp 属于第二者,且常常用于优化序列分割问题 Q1 P3195 A1 先列出…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • 用C语言实现单链表的各种操作(一)

    “用C语言实现单链表的各种操作(一)”详细介绍了如何通过C语言来实现单链表的常见操作。下面,我会结合该文章的内容,对其进行完整攻略的介绍。 文章的主要内容包括:单链表的定义、单链表的初始化、判断单链表是否为空、获取单链表中元素个数、在链表开头插入元素、在链表末尾插入元素、在链表中间插入元素、删除链表中指定元素、在链表中查找指定元素、链表的反转以及链表的销毁。…

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