LeetCode—224. 基本计算器(困难)

224. 基本计算器(困难)

题目描述:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()。

考察重点:使用go建立数据结构——栈。通过栈实现对字符串表达式中括号作用范围的判断。

type Item interface {
}

// Stack the stack of items
type Stack struct {
	Items []Item
}

// New Create a new Stack
func NewStack() *Stack {
	return &Stack{Items: []Item{}}
}

// Push adds an Item to the top of the stack
func (s *Stack) Push(t Item) {
	s.Items = append(s.Items, t)
}

// Pop removes an Item from the top of the stack
func (s *Stack) Pop() *Item {
	item := s.Items[len(s.Items)-1] // 后进先出
	s.Items = s.Items[0 : len(s.Items)-1]
	return &item
}

// Return an Item from the top of the stack
func (s *Stack) Top() *Item {
	item := s.Items[len(s.Items)-1] // 后进先出
	return &item
}
/**
符号之所以要入栈,是因为 1 - (2+3) - 5的这种情况,第一个‘-’只作用于(2+3) 而不作用于5,所以遇到')'就将'-'出栈
1 - (2 + (3 - 4) - 1)
遇到第一个(括号 - 入栈  作用范围(2 + (3 - 4) - 1)
遇到第二个(括号 + 入栈  作用范围(3 - 4)
遇到第一个)括号 + 出栈
遇到第二个)括号 - 出栈
*/
func Calculate(s string) int {
	res := 0
	stack := d.NewStack()
	stack.Push(1)
	opt := 1
	for i := 0; i < len(s); {
		switch s[i] {
		case ' ':
			i++
		case '+':
			opt = 1 * (*stack.Top()).(int)
			i++
		case '-':
			opt = -1 * (*stack.Top()).(int)
			i++
		case '(':
			stack.Push(opt)
			i++
		case ')':
			stack.Pop()
			i++
		default:
			start := i
			for ; i < len(s) && s[i] >= '0' && s[i] <= '9'; i++ {
			}
			temp, _ := strconv.Atoi(s[start:i])
			res += opt * temp
		}
	}
	return res
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ostrich5yw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值