数据结构 - 表达式计算
数据结构 - 表达式计算
〇、目标
- 实现对诸如
\[2+((1+2)\times3+4)\div5
\]
表达式的计算。
要素仅包括:数字,四则运算,括号,并且是一个完整且正确的表达式。
一、前导
1. 操作数和操作符(运算符)
记表达式中的数字为操作数,其它元素为操作符(运算符)。数字并不限定为一个字符,但操作符仅为一个字符。
2. 中缀表达式和后缀表达式
中缀表达式是指书写时所用的表达式,其特点是操作数在操作符两端。计算中缀表达式时必须要考虑操作符的优先级。括号的优先级最高。
后缀表达式是为计算机计算设计的表达式,其特点是操作符在操作数的后面,计算总按前后顺序进行,因此隐含了优先级。后缀表达式不需要括号。
二、算法
1.中缀表达式转后缀表达式
inputlist为输入的中缀表达式,outputlist为输出的后缀表达式
infix2sufix为转换函数
infix2sufix(inputlist, outputlist) {
stackOp 作为操作符栈
listSufix 作为后缀输出缓存
遍历inputlist,遍历指针为it {
若it为操作数:
stackOp.push(it)
若it为左括号:
stackOp.push(it)
若it为右括号:
循环出栈,并将弹出的元素追加至listSufix,直到
碰到左括号为止。弹出的左括号直接丢弃。
若it为其它操作符:
先检查stackOp是否为空:
如果为空:
stackOp.push(it)
如果不为空:
检查栈顶元素优先级:
如果栈顶元素优先级低于it的优先级:
stackOp.push(it)
否则(栈顶元素优先级不低于it优先级):
循环检查,将不满足条件的出栈并追加至listSufix,直到
栈空或者优先级条件不满足。
stackOp.push(it)
}
弹出stackOp中的剩余元素,并追加至listSufix。
outputlist=listSufix
}
2. 计算后缀表达式
calc为计算后缀表达式的函数
listSufix为输入的后缀表达式
calc(listSufix) {
stackops作为操作数栈
遍历listSufix,遍历指针为it {
如果it为操作数:
stackops.push(it)
如果it为操作符:
stackops连续出栈两个元素,分别记为num_b,num_a,
计算 num_a op(it) num_b,并将结果操作数压入stackops。
}
从stackops弹出一个元素,作为返回值返回。
}
3.操作符的优先级
示例如下:
用数字表示优先级,从小到大表示优先级从低到高:
运算符 | 优先级 |
---|---|
( | 1 |
-
- | 2
\(\times \div\) | 3
) | 9
- | 2
posted on 2020-10-31 17:35 amazzzzzing 阅读(786) 评论(0) 收藏 举报