栈是受限制的线性表,限制仅在栈顶处可以进行插入和删除操作因此栈具有后进先出(LIFO)的特性,所以衍生出了常见的如下两种应用:
一、括号匹配
判断某个式子的左括号"("、"{"、"[" 与其相应的右括号")"、"}"、"]"是否成功匹配,基本思想:
1.遍历表达式每个符号,当遇到左括号时,将其压入栈中。
2.遇到右括号时,判断栈是否为空,若为空则匹配失败。
3.若栈非空,则栈顶元素出栈判断是否是其对应的左括号,若不是则匹配失败。
4.遍历完且栈为空则匹配成功。
二、表达式转化及求值
常见的表达式为中缀表达式例如:A+B、A+B-C*D/E+F,运算符在两个操作数中间,利用左优先原则按照运算符的运算顺序将其转化为后缀表达式即运算符在两个操作数后:AB+、AB+CD*E/-F+ 中缀表达式到后缀表达式具体的转化思想如下:
1.遍历中缀表达式,如果遇到操作数直接加入后缀表达式。
2.如果遇到运算符,则比较栈顶元素依次弹出优先级高于等于当前运算符的所有运算符,并加入后缀表达式,但遇到"("或栈空则停止,再将当前运算符压入栈中。
3.如果遇到界限符,遇到"("则直接压入栈中,遇到")"则依次弹出栈内直至到"("的运算符并加入后缀表达式。
转化成后缀表达式后求值思想如下:
1.遍历表达式,若为操作数则压入栈中。
2.若为运算符则弹出两个栈顶元素,后弹出的为前操作数,进行运算后将结果压入栈中。
3.重复1、2直至处理完所有数据。
同理,前缀表达式为运算符在两个操作数前但是不同于后缀表达式,前缀表达式需要用右优先原则即可。
本文介绍了栈的后进先出特性在括号匹配中的使用,以及如何通过栈实现中缀表达式转化为后缀表达式和求值的过程,同时提及了前缀表达式的处理方法。
4717

被折叠的 条评论
为什么被折叠?



