题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

package main
import (
	"fmt"
	"strconv"
)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
*/
func solve( s string ) int {
    str := s
	//中缀表达式转数组
	arr := change2Arr(str)
	//中缀表达式 =》逆波兰表达式
	polan := change2Polan(arr)
	//计算结果
	return computePolan(polan)
}

func change2Arr(s string) []string {
	arr := make([]string, 0)
	size := len(s)
	for i := 0; i < size; {
		//数字
		if s[i] >= '0' && s[i] <= '9' {
			num := 0
			for ; i < size && s[i] >= '0' && s[i] <= '9'; i++ {
				num = num*10 + int(s[i]-'0')
			}
			str := strconv.Itoa(num)
			arr = append(arr, str)
		} else {
			//()加减乘除
			arr = append(arr, string(s[i]))
			i++
		}
	}
	return arr
}

func change2Polan(arr []string) []string {
	//存放运算符栈
	stack1 := make([]string, 0)
	//存放数字栈,这是最终的逆波兰表达式
	stack2 := make([]string, 0)
	for i := 0; i < len(arr); i++ {
		//遍历到(
		if arr[i] == "(" {
			stack1 = append(stack1, arr[i])
		} else if arr[i] == "+" || arr[i] == "-" || arr[i] == "*" || arr[i] == "/" {
			//遍历到运算符
			//当前运算符优先级不大于stack1的栈顶运算符
			for len(stack1) != 0 && stack1[len(stack1)-1] != "(" && !comparePriovity(arr[i], stack1[len(stack1)-1]) {
				stack2 = append(stack2, stack1[len(stack1)-1])
				stack1 = stack1[:len(stack1)-1]
			}
			//运算符入栈
			stack1 = append(stack1, arr[i])
		} else if arr[i] == ")" {
			//遍历到)
			for len(stack1) != 0 && stack1[len(stack1)-1] != "(" {
				stack2 = append(stack2, stack1[len(stack1)-1])
				stack1 = stack1[:len(stack1)-1]
			}
			//剔除(
			stack1 = stack1[:len(stack1)-1]
		} else {
			//遍历到数字
			stack2 = append(stack2, arr[i])
		}
	}
	//将剩余的符号取出来
	for len(stack1) != 0 {
		stack2 = append(stack2, stack1[len(stack1)-1])
		stack1 = stack1[:len(stack1)-1]
	}
	return stack2
}

func comparePriovity(sign1, sign2 string) bool {
	if (sign1 == "+" || sign1 == "-") && (sign2 == "+" || sign2 == "-") ||
		(sign1 == "*" || sign1 == "/") && (sign2 == "*" || sign2 == "/") {
		return false
	}
	if (sign1 == "+" || sign1 == "-") && (sign2 == "*" || sign2 == "/") {
		return false
	}
	if (sign1 == "*" || sign1 == "/") && (sign2 == "+" || sign2 == "-") {
		return true
	}
	return false
}

func computePolan(polan []string) int {
	stack := make([]int, 0)
	for i := 0; i < len(polan); i++ {
		//运算符
		if polan[i] == "+" || polan[i] == "-" || polan[i] == "*" || polan[i] == "/" {
			num1 := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			num2 := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			res := compute(num2, num1, polan[i])
			stack = append(stack, res)
		} else {
			//数字
			num, _ := strconv.Atoi(polan[i])
			stack = append(stack, num)
		}
	}
	return stack[0]
}

func compute(num1, num2 int, sign string) int {
	switch sign {
	case "+":
		return num1 + num2
	case "-":
		return num1 - num2
	case "*":
		return num1 * num2
	case "/":
		return num1 / num2
	default:
		return 0
	}
}

/*
*
输入:
"(2*(3-4))*5"

返回值:
-10

输入:
"3+2*3*4-1"

返回值:
26
*/
func main1() {
	//s := "(20*(3-4))*5" // -100
	//s := "2+(3-4)*5" // -3
	s := "3+2*3*4-1" // 26
	fmt.Println(solve(s))
}

全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务