mirror of
https://github.com/oxyanyano/2022-WangDao-CS-DS-Notes.git
synced 2026-02-02 18:29:00 +08:00
2.3 KiB
2.3 KiB
栈的应用
一、表达式求值(中缀表达式求值)
三种表达式:中缀表达式、后缀表达式、前缀表达式
中缀表达式:有界限符
后缀和前缀表达式:无界限符
注:方法一和方法二是分开的,方法三是中缀转后缀和后缀计算同时进行,一般用方法三解决
方法一:中缀表达式转后缀表达式,再用后缀表达式求值
1.中缀表达式转后缀表达式(用栈保存运算符)
中缀表达式从左往右扫描:
①遇到操作数,直接压入栈。
②遇到界限符,遇到“(”,直接压入栈;遇到“)”,依次弹出栈内运算符从左往右加入表达式,直到弹出“(”结束。
③遇到运算符,依次弹出比这个运算符优先级高的所有运算符,将此运算符压入栈。
2.后缀表达式求值(用栈存运算结果)
后缀表达式从左往右扫描:
①遇到操作数,直接压入栈。
②遇到运算符,弹出两个元素,执行相应运算,将运算结果压回栈顶
方法二:中缀表达式转前缀表达式,再用前缀表达式求值
1.中缀表达式转前缀表达式(用栈保存运算符)
中缀表达式从右往左扫描:
①遇到操作数,直接压入栈。
②遇到界限符,遇到“(”,直接压入栈;遇到“)”,依次弹出栈内运算符从右往左加入表达式,直到弹出“(”结束。
③遇到运算符,依次弹出比这个运算符优先级高的所有运算符,将此运算符压入栈。
2.前缀表达式求值(用栈存运算结果)
前缀表达式从右往左扫描:
①遇到操作数,直接压入栈。
②遇到运算符,弹出两个元素,执行相应运算,将运算结果压回栈顶
方法三:中缀转后缀和后缀计算同时进行(两个栈)
用两个栈:分别存操作数和运算符
①遇到操作数,直接压入操作数栈。
②遇到运算符或界限符,按“中缀转后缀”的逻辑压入运算符栈,每当弹出一个运算符时,相应地弹出两个操作数,执行相应运算,将运算结果压回操作数栈
二、递归
递归的背后是栈的应用