栈的应用Ⅰ--后缀表达式 括号匹配

来源:互联网 发布:四知文言文翻译注解 编辑:程序博客网 时间:2024/06/05 09:26

一、后缀表达式
  在我们日常生活中所见表达式都是中缀表达式,如 “5*(3+7)-4/2”,这中表达式符合我们的思维逻辑,可读性强,但是不利于计算机的解析。由波兰逻辑学家J.Lukasiewicz发明出后缀表达式,比如上式转变为后缀表达式”5 3 7 + * 4 2 / -“,这种人类难以适应的表达顺序,计算机却很受用。

1.计算机应用后缀表达式的过程:
如后缀表达式:”5 3 7 + * 4 2 / -”
规则:从左到右遍历表达式的每一个数字和符号,遇到数字就进栈,遇到是符号,就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

①初始化一个空栈。此栈用来对要运算的数字进出使用。

②后缀表达式中前三个都是数字,所以5,3,7进栈。
这里写图片描述

③接下来是’+’运算符,将栈顶的两个元素出栈进行加法运算,再将结果进栈。

④之后是’*’运算符,将栈顶的两个元素出栈进行运算,将运算结果再进栈。这里写图片描述

⑤之后4,2进栈,遇’/’将2,4出栈,2作为除数,4作为被除数。
这里写图片描述

⑥之后遇’-‘,50作为被减数。48入栈,最后出栈,栈为空结果为48.
这里写图片描述

二、中缀表达式转后缀表达式

如:中缀表达式”5*(3+7)-4/2”转为”5 3 7 + * 4 2 / -“

规则:顺序遍历数字和符号,数字输出,成为后缀表达式的一部分,遇符号则判断栈顶元素与其的优先级,若为右括号或者优先级不高于栈顶元素,则将栈顶元素依次出栈并输出,并将当前符号进栈,直到后缀表达式输出完成。

①5输出,’*’入栈,’(‘入栈,3输出,’+’入栈,7输出。
输出:5 3 7
这里写图片描述

②遇到’)’,则将’(‘之前的符号全部出栈输出。
输出:5 3 7 +
这里写图片描述

③遇到’-‘,优先级比栈顶’* ‘低,’* ‘出栈输出,’-‘进栈。
输出:5 3 7 + *

④输出4,遇到’/’比栈顶’-‘高,’/’进栈,输出2,表达式读取结束,栈内符号依次输出。
输出:5 3 7 + * 4 2 / -
这里写图片描述
中缀表达式转后缀表达式结束

三、括号匹配
三种配对括号’(‘,’)’,’[‘,’]’,’{‘,’}’的序列匹配

规则:做一个空栈,读入字符直到字符串尾。如果读到的字符为开放符号’(‘,’[‘,’{‘,则将其推入栈中,如果字符为封闭符号’)’,’]’,’}’,如果栈为空则报错,否则将栈顶元素弹出,如果不是对应的封闭元素,则报错,在字符串读取结束,栈不为空则报错。

如字符串: (a)c[b(d)]e(g{f})
①则顺序读取字符,第一个字符为’(‘开放符号,则将’(‘压栈。
这里写图片描述
②读取a,不进行操作,继而读取’)’为封闭符号,进行出栈匹配。栈顶元素为’(‘是对应的配对符号,则继续操作…
③直到最后字符串读取完成,查看top是否为-1。

四、函数栈
是重要知识点,保留。

阅读全文
0 0