数据结构学习笔记——前、中、后缀表达式的转换(栈的应用)

简介: 数据结构学习笔记——前、中、后缀表达式的转换(栈的应用)

一、前、中、后缀表达式定义


一般我们常用的中缀表达式,中缀表达式不仅依靠运算符的优先级,也要处理括号的优先级;后缀表达式中没有括号,只有操作数和运算符,且运算符放在操作数的后面;前缀表达式也是一种没有括号的算术表达式,其运算符写在前面,操作数写在后面。

1667235335065.jpg

将常用的中缀表达式转换为前缀表达式、后缀表达式后,可以通过栈的相关原理来实现具体的出栈 、入栈操作逻辑,从而可以一样完成与中缀表达式相同的运算。


二、具体转换步骤


(一)中缀表达式转换为前缀表达式


以a+b-c*d为例,将中缀表达式转换为前缀表达式。


1、首先按照运算优先级将所有的操作数都加上括号。

1667235376211.jpg

2、将运算符移至相对应的括号前。

1667235389708.jpg

3、将括号去掉,即可得到前缀表达式。

1667235398498.jpg


(二)中缀表达式转换为后缀表达式


与前缀表达式相反,第二步将运算符移至相对应的括号后,然后再去掉括号,如下图:

1667235441449.jpg

这里以中缀表达式转换为后缀表达式,简单讲解具体的栈的实现方法:

1、将一个中缀表达式转换为后缀表达式,首先从左到右扫描整个中缀表达式,当遇到操作数时加入至待定的后缀表达式区域中(这是一个栈);

2、遇到操作符时,若为’(‘,则入栈,若为’)',则依次将栈中的运算符加入至后缀表达式的栈中,直到出现‘(’后,从栈中删除‘(’;

3、遇到运算符时,当为比括号优先级高的优先级时,直接入栈,否则,依次从栈中弹出比当前运算符优先级高和优先级相等的运算符,直到遇到比它优先级低或者遇到一个‘(’为止;

4、当扫描完结束后,栈中的所有运算符依次出栈加入后缀表达式。

1667235470162.jpg

通过手工算,第一步转换为(a+((b-(c*d))/e)),第二步提运算符转为(a((b(cd)*)-e)/)+,去掉括号得到后缀表达式abcd*-e/+。

1667235483017.jpg

通过手工算,第一步转换为((A+B(-((C*D)/E)+F),第二步提运算符转为((AB)+(((CD)*E/)-F)+,去掉括号得到后缀表达式AB+CD*E/-F+。


例题

例1、表达式a*(b+c)-d的后缀表达式是________。


首先第一步,加上括号得:((a*(b+c))-d)

然后由于是转为后缀表达式,将符号提至对应的括号后,得:((a(bc)+)*d)-

括号去掉,即可得到后缀表达式:abc+*d-


例2、求表达式a / b + (c * d-e * f) / g的前缀表达式。


第一步也是加上括号:((a/b)+(((c*d)-(e*f))/g))

然后由于是转为前缀表达式,将符号提至对应的括号前,得:+(/(ab)/(-(*(cd)*(ef))g))

括号去掉,即可得到前缀表达式:+/ab/-*cd*efg


相关文章
|
15天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
6天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
15 1
|
9天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
12天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
14天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
41 4
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
18天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
初步认识栈和队列
初步认识栈和队列
58 10
|
1月前
数据结构(栈与列队)
数据结构(栈与列队)
17 1
|
1月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
44 3