表达式求值
表达式求值
http://www.nowcoder.com/questionTerminal/c215ba61c8b1443b996351df929dc4d4
使用后缀表达式对于表达式进行求值
1. 求后缀表达式
后缀表达式求取:后缀表达式结果使用队列 tmp 进行存储
- 遇到数字字符,截取相连的数字字符为一组,加入 tmp 中
- 设置符号优先级,入栈时 (、*、/ 大于 +、- 大于 ), 出栈时 *、/ 大于 +、- 大于 (,并构建存储符号的栈 charStack
- 当遍历到符号时,如果 charStack 的长度为 0,直接加入栈中
- 如果为 ),则将 charStack 中的符号出栈,只至遇到 (
- 如果为 (、*、\,则直接入栈
- 如果为 +、-,则将优先级不小于它们的符号全部出栈,直到遇到 ( 或栈空为止
charStack := make([]byte,0)
tmp := make([]string,0)
for i:=0;i<len(s);{
if s[i] >= '0' && s[i] <= '9'{
t := ""
j := i
for ;j<len(s);j++{
if s[j] >= '0' && s[j] <= '9'{
t+= string(s[j])
}else{
break
}
}
tmp = append(tmp,string(t))
i = j
}else{
if len(charStack) == 0{
charStack = append(charStack, s[i])
}else{
if s[i] == ')'{
t := 0
for j:=len(charStack)-1;j>=0;j--{
if charStack[j] == '('{
break
}else{
tmp = append(tmp, string(charStack[j]))
t++
}
}
charStack = charStack[:len(charStack)-t-1]
}else if s[i] == '+' || s[i] == '-'{
t :=0
for j:=len(charStack)-1;j>=0;j--{
if charStack[j] == '(' {
break
}else{
tmp = append(tmp, string(charStack[j]))
t++
}
}
charStack = charStack[:len(charStack)-t]
charStack = append(charStack, s[i])
}else{
charStack = append(charStack, s[i])
}
}
i++
}
}
for i:=len(charStack)-1;i>=0;i--{
tmp = append(tmp,string(charStack[i]))
}2. 通过后缀表达式求值
- 遍历后缀表达式队列 tmp,构建存储结果的栈 numStack
- 遇到数字,将其入栈
- 遇到运算符,从 numStack 中使顶部两个数字出栈,先出的位于运算符右边,后出的位于左边。例如减号中,后面为被减数,前面为减数
- 循环2-3 步,直至遍历完成,输出 numStack 元素即为最终结果。
numStack:=make([]int,0)
for i:=0;i<len(tmp);i++{
t,err := strconv.Atoi(tmp[i])
if err != nil{
if len(numStack) < 2{
continue
}
a,b := numStack[len(numStack)-2],numStack[len(numStack)-1]
numStack = numStack[:len(numStack)-2]
res := 0
switch tmp[i]{
case "+":
res = a+b
case "-":
res = a-b
case "*":
res = a*b
case "/":
res = a/b
}
numStack = append(numStack, res)
}else{
numStack =append(numStack, t)
}
}
return numStack[0]
查看7道真题和解析
