Files
2022-WangDao-CS-DS-Notes/2.4栈的应用.md
2022-03-28 16:49:12 +08:00

2.3 KiB
Raw Blame History

栈的应用

一、表达式求值(中缀表达式求值)

三种表达式:中缀表达式后缀表达式前缀表达式

中缀表达式:有界限符

后缀和前缀表达式:无界限符

:方法一和方法二是分开的,方法三是中缀转后缀和后缀计算同时进行,一般用方法三解决

方法一:中缀表达式转后缀表达式,再用后缀表达式求值

1.中缀表达式转后缀表达式(用保存运算符

中缀表达式从左往右扫描:

①遇到操作数,直接压入栈。

②遇到界限符,遇到“(”,直接压入栈;遇到“)”,依次弹出栈内运算符从左往右加入表达式,直到弹出“(”结束。

③遇到运算符,依次弹出比这个运算符优先级高的所有运算符,将此运算符压入栈。

2.后缀表达式求值(用运算结果

后缀表达式从左往右扫描:

①遇到操作数,直接压入栈。

②遇到运算符,弹出两个元素,执行相应运算,将运算结果压回栈顶

方法二:中缀表达式转前缀表达式,再用前缀表达式求值

1.中缀表达式转前缀表达式(用保存运算符

中缀表达式从右往左扫描:

①遇到操作数,直接压入栈。

②遇到界限符,遇到“(”,直接压入栈;遇到“)”,依次弹出栈内运算符从右往左加入表达式,直到弹出“(”结束。

③遇到运算符,依次弹出比这个运算符优先级高的所有运算符,将此运算符压入栈。

2.前缀表达式求值(用运算结果

前缀表达式从右往左扫描:

①遇到操作数,直接压入栈。

②遇到运算符,弹出两个元素,执行相应运算,将运算结果压回栈顶

方法三:中缀转后缀和后缀计算同时进行(两个栈)

两个栈:分别存操作数运算符

①遇到操作数,直接压入操作数栈。

②遇到运算符界限符,按“中缀转后缀”的逻辑压入运算符栈,每当弹出一个运算符时,相应地弹出两个操作数,执行相应运算,将运算结果压回操作数栈

二、递归

递归的背后是栈的应用