返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何理解前缀,后缀,中缀表达式转化求值问题
  • 702
分享到

如何理解前缀,后缀,中缀表达式转化求值问题

2024-04-02 19:04:59 702人浏览 八月长安
摘要

这篇文章主要讲解了“如何理解前缀,后缀,中缀表达式转化求值问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解前缀,后缀,中缀表达式转化求值问题”吧!

这篇文章主要讲解了“如何理解前缀,后缀,中缀表达式转化求值问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解前缀,后缀,中缀表达式转化求值问题”吧!

算法,一门既不容易入门,也不容易精通的学问。

上次介绍如何利用栈实现中缀表达式求值,如果我是出题官,当然要考前缀,后缀,中缀表达式相互转换,然后就变成了利用栈实现前缀和后缀表达式求值。

前缀,后缀,中缀表达式相互转换及其运算,可以说是计算机考研的一个重点。

首先看下面所示表格:

如何理解前缀,后缀,中缀表达式转化求值问题

  • 注意:前序表达式和后序表达式是没有扩号

中缀表达式转前缀表达式求值

中缀表达式转前缀表达式的规则:

1、反转输入字符串,如“2*3/(2-1)+3*(4-1)” 反转后为“ )1-4(*3+)1-2(/3*2”, 2、从字符串中取出下一个字符   2.1.如果是操作数,直接输出   2.2.如果是“)”,压入栈中   2.3.如果是运算符但不是“(”,“)”,则不断循环进行以下处理     2.3.1.如果栈为空,则此运算符进栈,结束此步骤     2.3.2.如果栈顶是“)”,则此运算符进栈,结束此步骤     2.3.2.如果此运算符与栈顶优先级相同或者更高,此运算符进栈,结束此步骤     2.3.4.否则,运算符连续出栈,直到满足上述三个条件之一,然后此运算符进栈   2.4、如果是“(”,则运算符连续出栈,直到遇见“)”为止,将“)”出栈且丢弃之 3、如果还有更多的字符串,则转到第2步 4、不在有未处理的字符串了,输出栈中剩余元素 5、再次反转字符串得到最终结果

经过上面的步骤,得到的输出既是转换得到的前缀表达式。

前缀表达式的计算方法:对前缀表达式从后向前扫描,设定一个操作数栈,如果是操作数,则将其直接入栈,如果是操作符,则从栈中弹出操作符对应的操作数进行运算,并将计算结果压栈。直至从右到左扫描完毕整个前缀表达式,这时操作数栈中应该只有一个元素,该元素的值则为前缀表达式的计算结果。

上面的过程使用数据结构栈来实现,具体代码如下

''' @Author:Runsen @WeChat:RunsenLiu  @微信公众号:python之王 @CSDN:https://blog.csdn.net/weixin_44510615 @GitHubHttps://github.com/MaoliRUNsen @Date:2020/12/17 ''' import re  class Stack():     def __init__(self):         self.items = []      def push(self, item):         return self.items.append(item)      def pop(self):         return self.items.pop()      def size(self):         return len(self.items)      def peek(self):         return self.items[len(self.items) - 1]      def display(self):         print(self.items)  def infix_to_prefix(s):     prec = {         '*': 3,         '/': 3,         '+': 2,         '-': 2,         '(': 4,         ')': 1     }      a = re.findall('[1-9]\d*|[\+\-\*\/\(\)]', input('请输入中缀表达式:'))     prefix = []      for x in a[::-1]:         if re.match('[0-9]', x):             #操作数,直接输出             prefix.append(x)         else:             #如果是“)”,压入栈中             if x == ')':                 s.push(x)             elif x == '(':                 while True:                     i = s.pop()                     if i == ')':                         break                     else:                         prefix.append(i)             else:                 if s.size() > 0 and prec[x] <= prec[s.peek()]:                     prefix.append(s.pop())                 s.push(x)     for _ in range(s.size()):         prefix.append(s.pop())     return prefix[::-1]      def cal_prefix(s, prefix):     # 思路:对前缀表达式从后向前扫描,设定一个操作数栈,如果是操作数,则将其直接入栈,如果是操作符,则从栈中弹出操作符对应的操作数进行运算,并将计算结果压栈。     # 直至从右到左扫描完毕整个前缀表达式,这时操作数栈中应该只有一个元素,该元素的值则为前缀表达式的计算结果。     for x in prefix[::-1]:         if re.match('[0-9]', x):             s.push(x)         else:             a2 = int(s.pop())             a1 = int(s.pop())             if x == '*':                 a = a1 * a2             elif x == '/':                 a = a2 / a1             elif x == '+':                 a = a1 + a2             else:                 a = a2 - a1             s.push(a)     return s.pop()  if __name__ == '__main__':     s = Stack()     prefix = infix_to_prefix(s)     print('前缀表达式:', prefix)     prefix_val = cal_prefix(s, prefix)     print('前缀表达式计算结果:', prefix_val)  请输入中缀表达式:2*3/(2-1)+3*(4-1) 前缀表达式: ['+', '*', '2', '/', '3', '-', '2', '1', '*', '3', '-', '4', '1'] 前缀表达式计算结果: 15 请输入中缀表达式:9+(3-1*2)*3+10/2 前缀表达式: ['+', '+', '9', '*', '-', '3', '*', '1', '2', '3', '/', '10', '2'] 前缀表达式计算结果: 17

中缀表达式转换为后缀表达式求值

中缀表达式转后缀表达式的规则:

1.遇到操作数,直接输出;

2.栈为空时,遇到运算符,入栈;

3.遇到左括号,将其入栈;

4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;

5.遇到其他运算符&rsquo;+”-”*”/&rsquo;时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;

6.最终将栈中的元素依次出栈,输出。

经过上面的步骤,得到的输出既是转换得到的后缀表达式。

后缀表达式的计算方法:对后缀表达式从前向后扫描,设定一个操作数栈,如果是操作数,则将其直接入栈,如果是操作符,则从栈中弹出操作符对应的操作数进行运算,并将计算结果压栈。直至从右到左扫描完毕整个后缀表达式,这时操作数栈中应该只有一个元素,该元素的值则为后缀表达式的计算结果。

上面的过程使用数据结构栈来实现,具体代码如下:

''' @Author:Runsen @WeChat:RunsenLiu @微信公众号:Python之王 @CSDN:https://blog.csdn.net/weixin_44510615 @Github:https://github.com/MaoliRUNsen @Date:2020/12/17 ''' import re  class Stack():     def __init__(self):         self.items = []      def push(self, item):         return self.items.append(item)      def pop(self):         return self.items.pop()      def size(self):         return len(self.items)      def peek(self):         return self.items[len(self.items) - 1]      def display(self):         print(self.items)   def infix_to_postfix (s):     prec = {         '*': 3,         '/': 3,         '+': 2,         '-': 2,         '(': 1,         ')': 4     }      a = re.findall('[1-9]\d*|[\+\-\*\/\(\)]', input('请输入中缀表达式:'))     postfix = []      for x in a:         if re.match('[0-9]', x):             # 操作数,直接输出             postfix.append(x)         else:             # 如果是“(”,压入栈中             if x == '(':                 s.push(x)             elif x == ')':                 while True:                     i = s.pop()                     if i == '(':                         break                     else:                         postfix.append(i)             else:                 if s.size() > 0 and prec[x] <= prec[s.peek()]:                     postfix.append(s.pop())                 s.push(x)     for _ in range(s.size()):         postfix.append(s.pop())     return postfix   def cal_postfix (s, postfix):     for x in postfix:         if re.match('[0-9]', x):             s.push(x)         else:             a1 = int(s.pop())             a2 = int(s.pop())             if x == '*':                 a = a1 * a2             elif x == '/':                 a = a2 / a1             elif x == '+':                 a = a1 + a2             else:                 a = a2 - a1             s.push(a)     return s.pop()   if __name__ == '__main__':     s = Stack()     postfix = infix_to_postfix(s)     print('后缀表达式:', postfix)     postfix_val = cal_postfix (s, postfix)     print('后缀表达式计算结果:', postfix_val)   请输入中缀表达式:2*3/(2-1)+3*(4-1) ['2', '3', '*', '2', '1', '-', '/', '3', '4', '1', '-'] 后缀表达式: ['2', '3', '*', '2', '1', '-', '/', '3', '4', '1', '-', '*', '+'] 后缀表达式计算结果: 15 请输入中缀表达式:9+(3-1*2)*3+10/2 后缀表达式: ['9', '3', '1', '2', '*', '-', '3', '*', '10', '2', '/', '+', '+'] 后缀表达式计算结果: 17

其实此题是LeetCode第150题,逆波兰表达式求值。

根据 逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

示例 1:  输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 示例 2:  输入: ["4", "13", "5", "/", "+"] 输出: 6 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

前缀表达式转中缀表达式

从右往左开始,取出一个操作符和操作符右边的两个数进行计算,并将计算的结果放过去,直到计算结束。以前缀表达式+/*23-21*3-41为例,将其转换为中缀表达式:

(1)取出-、4、1,计算并将结果放回得到+/*23-21*3(4-1);

(2)取出*、3、(4-1),计算并将结果放回得到+/*23-21(3*(4-1));

(3)取出-、2、1,计算并将结果放回得到+/*23(2-1)(3*(4-1));

(3)取出*、2、3,计算并将结果放回得到+/(2*3)(2-1)(3*(4-1));

(4)取出/、(2*3)、(2-1),计算并将结果放回得到+((2*3)/(2-1))(3*(4-1));

(5)取出+、((2*3)/(2-1))、(3*(4-1)),计算将结果放回得到((2*3)/(2-1))+(3*(4-1)),计算结束,显然计算结果为15。

后缀表达式转中缀表达式从左向右开始,取出一个操作符和操作符左边的两个数进行计算,并将计算的结果放过去,直到计算结束,以后缀表达式23*21-/341-*+为例,将其转换为中缀表达式:(1)取出2、3、*,计算并将结果放回得到(2*3)21-/341-*+;

(2)取出2,1,-,计算并将结果放回得到(2*3)(2-1)/341-*+;

(3)取出(2*3)、(2-1)、/,计算并将结果放回得到((2*3)/(2-1))341-*+;

(4)取出4,1,-,计算并将结果放回得到((2*3)/(2-1)) 3(4-1)*+;

(5)取出3,(4-1),*,计算并将结果放回得到((2*3)/(2-1)) 3*(4-1)+;

(6)取出((2*3)/(2-1)),3*(4-1),+,计算并将结果放回得到((2*3)/(2-1)) + 3*(4-1),显然计算结果为15。

感谢各位的阅读,以上就是“如何理解前缀,后缀,中缀表达式转化求值问题”的内容了,经过本文的学习后,相信大家对如何理解前缀,后缀,中缀表达式转化求值问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何理解前缀,后缀,中缀表达式转化求值问题

本文链接: https://lsjlt.com/news/84166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解前缀,后缀,中缀表达式转化求值问题
    这篇文章主要讲解了“如何理解前缀,后缀,中缀表达式转化求值问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解前缀,后缀,中缀表达式转化求值问题”吧!...
    99+
    2024-04-02
  • C++ 如何使用栈求解中缀、后缀表达式的值
    目录1. 前言2. 中缀表达式2.1 求值流程2.2 演示表达式4*6^(3+3*3-2*3)-8 的求值过程当2.3 编码实现3.后缀表达式4. 中缀转后缀表达式4.1 流程演示4...
    99+
    2022-11-13
    C++中缀 后缀表达式的值 C++ 栈求解表达式的值
  • C++如何实现中缀表达式转化为后缀表达式
    这篇文章将为大家详细讲解有关C++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目描述所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象...
    99+
    2023-06-29
  • C++实现中缀表达式转化为后缀表达式详解
    目录1.题目描述2.输入输出3.解题思路4.样例解析 5.代码实现5.1.优先级确认5.2.转换函数1.题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运...
    99+
    2024-04-02
  • Java中缀表达式转后缀表达式流程详解
    目录一、栈1、栈的基本介绍2、栈的底层实现二、中缀表达式转后缀表达式1、拆解中缀表达式2、中缀转后缀的算法3、中缀转后缀代码解析4、对后缀表达式进行计算一、栈 1、栈的基本介绍 栈是...
    99+
    2024-04-02
  • C++中怎么将中缀表达式转换为后缀表达式
    本篇文章为大家展示了C++中怎么将中缀表达式转换为后缀表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可用字符数组存储整行输入的中...
    99+
    2023-06-05
  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式
    目录1、人如何解析算术表达式①、求值 3+4-5②、求值 3+4*52、计算机如何解析算术表达式3、后缀表达式①、如何将中缀表达式转换为后缀表达式?一、先自定义一个栈二、前缀表达式转...
    99+
    2024-04-02
  • Java数据结构和算法之前缀、中缀和后缀表达式的示例分析
    小编给大家分享一下Java数据结构和算法之前缀、中缀和后缀表达式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、人如何解析算术表达式如何解析算术表达式?或者换种说法,遇到某个算术表达式,我们是如何计算的:①、求...
    99+
    2023-06-28
  • 后缀表达式的java如何实现
    这篇“后缀表达式的java如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“后缀表达式的java如何实现”文章吧。中缀表...
    99+
    2023-07-02
  • Java 中执行动态表达式语句前中后缀Ognl、SpEL、Groovy、Jexl3
    目录Ognl、SpEL、Groovy、Jexl3一、前中后缀简单描述1、前缀、中缀、后缀表达式(逆波兰表达式)2、中缀表达式3、后缀表达式4、前缀表达式二、OGNL三、SpEL四、J...
    99+
    2024-04-02
  • 如何理解栈在括号匹配和表达式求值中的应用
    这篇文章主要讲解了“如何理解栈在括号匹配和表达式求值中的应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解栈在括号匹配和表达式求值中的应用”吧!编程...
    99+
    2024-04-02
  • 如何在Python中处理正则表达式的问题
    如何在Python中处理正则表达式的问题,需要具体代码示例正则表达式是一种用于匹配和处理文本的强大工具。在Python中,可以使用内置的re模块来处理正则表达式。本文将介绍如何在Python中利用正则表达式进行文本处理,并提供具体的代码示例...
    99+
    2023-10-22
    Python正则表达式处理
  • vue如何解决数据加载时,插值表达式闪烁问题
    目录数据加载,插值表达式闪烁问题1.在公共的css样式中加入2.在el挂载的标签上添加解决插值表达式渲染数据闪动先看代码出现的问题解决方法如下图数据加载,插值表达式闪烁问题 1.在公...
    99+
    2024-04-02
  • vue基础语法中的插值表达式如何理解
    vue基础语法中的插值表达式如何理解,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、vscode插件介绍在我们演示插值表达式之前,我们先安装这一个VScode给我们提供的插件...
    99+
    2023-06-29
  • 如何解决SqlServer类似正则表达式的字符处理问题
    小编给大家分享一下如何解决SqlServer类似正则表达式的字符处理问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL S...
    99+
    2024-04-02
  • 如何解决vscode中保存后html自动格式化的问题
    这篇文章将为大家详细讲解有关如何解决vscode中保存后html自动格式化的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近几天更新了 vsCode 的版本,目前所...
    99+
    2024-04-02
  • Go语言中如何处理并发文件的文件系统文件内容搜索和正则表达式匹配问题?
    Go语言是一种强大的程序设计语言,具有简单易学、高效并发的特点。在Go语言中,处理并发文件的文件系统文件内容搜索和正则表达式匹配问题非常简单。本文将详细介绍如何通过Go语言实现这些功能,并提供具体的代码示例。文件系统文件内容搜索文件系统文件...
    99+
    2023-10-22
    搜索 正则表达式 并发 匹配 文件系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作