数据结构学习:前缀中缀后缀表达式转化

数据结构学习:前缀中缀后缀表达式转化

中缀转后缀的手算方法:
① 确定中缀表达式中各个运算符的运算顺序
② 选择下一个运算符,按照「左操作数 右操作数 运算符」的方式组合成一个新的操作数
③ 如果还有运算符没被处理,就继续 ②
数据结构学习:前缀中缀后缀表达式转化_第1张图片

由于运算顺序不唯一,因此对应的后缀表达式也不唯一
“左优先”原则:只要左边的运算符能先计算,就优先算左边的

后缀表达式的手算方法:
从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数
数据结构学习:前缀中缀后缀表达式转化_第2张图片

用栈实现后缀表达式的计算:
①从左往右扫描下一个元素,直到处理完所有元素
②若扫描到操作数则压入栈,并回到①;否则执行③
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①

注意:先出栈的是“右操作数”
数据结构学习:前缀中缀后缀表达式转化_第3张图片

栈里的大致情况为:
数据结构学习:前缀中缀后缀表达式转化_第4张图片
数据结构学习:前缀中缀后缀表达式转化_第5张图片数据结构学习:前缀中缀后缀表达式转化_第6张图片

中缀转前缀的手算方法:
① 确定中缀表达式中各个运算符的运算顺序
② 选择下一个运算符,按照「运算符 左操作数 右操作数」的方式组合成一个新的操作数
③ 如果还有运算符没被处理,就继续 ②
(从右往左算,从右往左看)
数据结构学习:前缀中缀后缀表达式转化_第7张图片

“右优先”原则:只要右边的运算符能先计算,就优先算右边的。

用栈实现前缀表达式的计算:
①从右往左扫描下一个元素,直到处理完所有元素
②若扫描到操作数则压入栈,并回到①;否则执行③
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①

数据结构学习:前缀中缀后缀表达式转化_第8张图片

中缀表达式转后缀表达式(机算)

初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。
从左到右处理各个元素,直到末尾。可能遇到三种情况:
① 遇到操作数。直接加入后缀表达式。
② 遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到弹出“(”为止。注意:“(”不加入后缀表达式。
③ 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(” 或栈空则停止。之后再把当前运算符入栈。
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。

Eg:
A + B - C * D / E + F
步骤:
1.遇到操作数A。直接加入后缀表达式:A
2.遇到运算符+,压入栈底,栈底为:+
3.遇到操作数B。直接加入后缀表达式:A B,栈底为:+
4.遇到运算符-,依次弹出栈中优先级高于或等于-的所有运算符,即弹出+,并把运算符-压入栈,后缀表达式:A B +,栈底为-
5.遇到操作数C。直接加入后缀表达式:A B + C
6.遇到运算符*,栈里没有优先级高于的运算符,不弹出栈,把压入栈,栈:栈底为-,栈顶为*,后缀表达式:A B + C
数据结构学习:前缀中缀后缀表达式转化_第9张图片

7.遇到操作数D。直接加入后缀表达式:A B + C D
8.遇到运算符/,依次弹出栈中优先级高于或等于/的所有运算符,即弹出*,把/压入栈,栈:栈底为-,栈顶为/,后缀表达式:A B + C D *
9.遇到操作数E。直接加入后缀表达式:A B + C D * E
数据结构学习:前缀中缀后缀表达式转化_第10张图片

10.遇到运算符+,依次弹出栈中优先级高于或等于+的所有运算符,即弹出/ 与- ,把+压入栈,栈:栈底为+,后缀表达式:A B + C D * E / -
11.遇到操作数F。直接加入后缀表达式:A B + C D * E / - F
12.处理完所有字符,将栈中剩余运算符+依次弹出,并加入后缀表达式:A B + C D * E / - F +

Eg:
A + B * (C - D) – E / F
步骤
1.遇到操作数A。直接加入后缀表达式:A
2.遇到运算符+,压入栈底,栈底为:+
3.遇到操作数B。直接加入后缀表达式:A B,栈底为:+
4.遇到运算符*,栈里没有优先级高于的运算符,不弹出栈,把压入栈,栈:栈底为+,栈顶为*,后缀表达式:A B
5.遇到界限符(,把(压入栈,栈:栈底为+,栈中间为*,栈顶为(,后缀表达式:A B
6.遇到操作数C。直接加入后缀表达式:A B C,栈:栈底为+,栈中间为*,栈顶为(
数据结构学习:前缀中缀后缀表达式转化_第11张图片

7.遇到运算符-,压入栈,前面为(,不弹出栈内元素
数据结构学习:前缀中缀后缀表达式转化_第12张图片

8.遇到操作数D。直接加入后缀表达式:A B C D
9.遇到界限符),弹出-(,运算法-加入到后缀表达式中,而界限符 ( 不加入后缀表达式
在这里插入图片描述

10.遇到运算符 - ,把栈里优先级高于-的运算法弹出
数据结构学习:前缀中缀后缀表达式转化_第13张图片

11.遇到操作数D。直接加入后缀表达式:A B C D - * + E
12.遇到运算符/,压入栈
13.遇到操作数F。直接加入后缀表达式:A B C D - * + E F
在这里插入图片描述

14…处理完所有字符,将栈中剩余运算符依次弹出,后缀表达式:A B C D - * + E F / -

后缀表达式的计算(机算)
用栈实现后缀表达式的计算:
①从左往右扫描下一个元素,直到处理完所有元素
②若扫描到操作数则压入栈,并回到①;否则执行③
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①

中缀表达式的计算(用栈实现)

用栈实现中缀表达式的计算:
初始化两个栈,操作数栈和运算符栈
若扫描到操作数,压入操作数栈
若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回操作数栈)

函数调用的特点:最后被调用的函数最先执行结束(LIFO)

函数调用时,需要用一个“函数调用栈” 存储:
① 调用返回地址
② 实参
③ 局部变量

递归调用时,函数调用栈可称为“递归工作栈”
每进入一层递归,就将递归调用所需信息压入栈顶
每退出一层递归,就从栈顶弹出相应信息

缺点:效率低,太多层递归可能会导致栈溢出;可能包含很多重复计算

你可能感兴趣的:(408数据结构学习,数据结构,栈)