中缀表达式求值
2015-09-18 12:46
281 查看
表达式求值都需要2个栈。一个是符号栈,另一个是数字栈。
拿上面的后缀式45+ 来说, 咱们刚才将表达式从4+5转换到45+的过程是咱们一眼就能看出来的,但是计算机不能像咱们这样做,因为他不会。他只会从表达式的开头,顺序扫描表达式的每一个字符,它不能像咱们一样 一眼就‘看’出来。
计算机是如何转换的呢?
1.从左到右顺序扫描表达式的每一个字符。
2.如果是操作数 则直接压入数字栈。
3.如果是操作符 则根据符号栈的当前状态来决定怎么处理这个符号。
处理运算符的过程:
|- 如果当前符号栈为空,则直接将该运算符压入符号栈。
|- 如果当前符号栈栈顶符号是左括号‘(’则也直接将该运算符压入符号栈。
|- 如果当前符号栈栈顶符号的优先级<该运算符,还是直接将该运算符压栈。
|- 如果当前符号栈栈顶符号的优先级>=该运算符,则将栈顶运算符(OP)取出来,接着从数字栈中取2个数b、a,然后将a(OP)b的结果压入数字栈中。
|- 如果当前符号是右括号‘)’,则不将它压入栈,而是不断从2个栈中,弹出1个符号和2个操作数,然后将运算结果压入数字栈 ,直到遇到左括号‘(’。
|- 然后继续向表达式的后面扫描,直到表达式结束。
当表达式解析结束的时候,若符号栈不为空,则不断的从符号栈和数字栈中弹出元素,进行计算。
当符号栈为空后,数字栈栈顶元素就是最后的结果。
拿上面的后缀式45+ 来说, 咱们刚才将表达式从4+5转换到45+的过程是咱们一眼就能看出来的,但是计算机不能像咱们这样做,因为他不会。他只会从表达式的开头,顺序扫描表达式的每一个字符,它不能像咱们一样 一眼就‘看’出来。
计算机是如何转换的呢?
1.从左到右顺序扫描表达式的每一个字符。
2.如果是操作数 则直接压入数字栈。
3.如果是操作符 则根据符号栈的当前状态来决定怎么处理这个符号。
处理运算符的过程:
|- 如果当前符号栈为空,则直接将该运算符压入符号栈。
|- 如果当前符号栈栈顶符号是左括号‘(’则也直接将该运算符压入符号栈。
|- 如果当前符号栈栈顶符号的优先级<该运算符,还是直接将该运算符压栈。
|- 如果当前符号栈栈顶符号的优先级>=该运算符,则将栈顶运算符(OP)取出来,接着从数字栈中取2个数b、a,然后将a(OP)b的结果压入数字栈中。
|- 如果当前符号是右括号‘)’,则不将它压入栈,而是不断从2个栈中,弹出1个符号和2个操作数,然后将运算结果压入数字栈 ,直到遇到左括号‘(’。
|- 然后继续向表达式的后面扫描,直到表达式结束。
当表达式解析结束的时候,若符号栈不为空,则不断的从符号栈和数字栈中弹出元素,进行计算。
当符号栈为空后,数字栈栈顶元素就是最后的结果。
相关文章推荐
- 第3周项目2 建设“顺序表”算法库
- iOS学习重要知识点整理02-进程和线程的一个简单解释
- 创建使用动态链接库
- 计算机网络之概念解析
- 杭电acm1005
- Codeforces Round #320 (Div. 2)(A~E)
- 计算机网络之概念解析
- In SQL, what is the difference between a left join and a left outer join?
- Delete Node in a Linked List
- 静态语句块,非静态语句块,构造方法在子类和父类的执行顺序
- 2015年9月17日第一节课html1-1
- BigDecimal
- Git常用命令
- Invert Binary Tree
- uva 11732 "strcmp()" Anyone?(字典树)
- Factory && AbstractFactory
- 移动通讯
- Redis学习手册(目录)
- Xcode中如何解决32位时%lu警告、64位%u警告。有图为证
- Redis学习手册(实例代码)