栈的应用--括号匹配
1. 扫描字符串,遇到左括号( [ { ,将其入栈。
2. 遇到右括号) ] },弹栈,比较左括号与右括号是否匹配,匹配则继续,直到字符串扫描完毕且栈不为空,才算成功。否则失败。
3. " )( " , " { } ) " 弹栈时下溢,失败。
4. "(" , "()(" 字符串扫描完毕,但栈不为空,失败。
栈的应用--逆波兰表达式(中缀转后缀)
1. 考虑6种操作符: + - * / ( )
2. 栈 opera[100] 存放临时操作符, 数组 num[100] 存放后缀表达式。
3. 步骤如下,扫描字符串。
(1)如果是数字,则直接放入数组num[100]中。
(2)如果是操作符,则进一步判断。
① 左括号 ( , 直接入栈。
② 运算符 + - * /
a) 若栈空,则直接放入
b) 若栈顶是运算符,且该运算符小于栈顶运算符优先级该运算符,则将栈顶运算符弹出,放入数组num[100]中,然后比较新的栈顶运算符。
c) 若栈顶是运算符,且该运算符大于栈顶运算符优先级该运算符,则将该运算符入栈。
③ 右括号 ) , 弹出栈opera[100]中左括号( 后的全部运算符,放入数组num[100]中,丢弃左右括号( )。
(3)扫描完毕,则按顺序弹出栈中所有运算符放入数组num[100]中.
4. 数组num[100]中存放着完整的后缀表达式。
*运算符优先级(从大到小):(同等级的运算符,哪个在前,哪个优先级高)
①字符串中的左括号(
②乘除 * / ,
③+ - ,
★ ④栈中的左括号(
例子:
★核心就是记住(如果扫描到的运算符优先级小于栈顶运算符,弹栈并继续比较,其他情况入栈)