算法课-计算器-力扣

func calculate(s string) int {

	dataStack := []int{}
	opStack := []byte{}

	for i := 0; i < len(s); i++ {
		b := s[i]
		if b == ' ' {
			continue
		}

		if judgeNum(b) {
			v := 0
			for ; i < len(s) && s[i] >= '0' && s[i] <= '9'; i++ {
				v = v*10 + int(s[i]-'0')
			}
			i--
			dataStack = append(dataStack, v)
		} else {
			for len(opStack) > 0 && priority(b) <= priority(opStack[len(opStack)-1]) {
				op := opStack[len(opStack)-1]
				opStack = opStack[:len(opStack)-1]

				data1, data2 := dataStack[len(dataStack)-2], dataStack[len(dataStack)-1]
				dataStack = dataStack[:len(dataStack)-2]

				dataStack = append(dataStack, compute(data1, data2, op))
			}

			opStack = append(opStack, b)
		}
	}

	//opStack 中的运算符优先级一次降低
	for len(opStack) != 0 {
		op := opStack[len(opStack)-1]
		opStack = opStack[:len(opStack)-1]

		data1, data2 := dataStack[len(dataStack)-2], dataStack[len(dataStack)-1]
		dataStack = dataStack[:len(dataStack)-2]

		dataStack = append(dataStack, compute(data1, data2, op))
	}

	return dataStack[0]
}

func judgeNum(b byte) bool {
	return b >= '0' && b <= '9'
}

func compute(data1, data2 int, op byte) int {
	switch op {
	case '+':
		return data1 + data2
	case '-':
		return data1 - data2
	case '*':
		return data1 * data2
	case '/':
		return data1 / data2
	}

	return 0
}

func priority(op byte) int {
	switch op {
	case '+':
		return 0
	case '-':
		return 0
	case '*':
		return 1
	case '/':
		return 1
	}

	return 0
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值