227. 基本计算器 II

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

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7
示例 2:

输入:s = " 3/2 "
输出:1
示例 3:

输入:s = " 3+5 / 2 "
输出:5

题解:使用辅助栈

使用栈来存放数,栈中只用来计算每个部分的和。
对于表达式中的符号进行处理,如果是乘除法,则先将乘除法进行计算,获得计算结果,如果是减法,则直接把后面的数字变为 负数,那么整个表达式的操作就变成了对所有元素进行相加了,而栈主要就是存放处理后的元素。最后进行相加
遍历表达式,使用num 记录遍历的数字大小,num初始化为0;使用opt记录当前的运算符,初始化为'+'。

  • 当遇到的字符c 是' ' 时,直接continue 遍历下一个

  • 当遇到的字符c是数字时,更新num = num*10 + (c - ' 0 ');

  • 当遇到左括号时,此时需要向后找到对应的右括号。

    • 定义 count 记录左括号数,定义指针j = i+1向后遍历字符串寻找右括号

    • 如果遇到左括号,则count++,遇到右括号,count--;然后再次向右移动j,直到count为0,说明找到了对应的右括号

    • 对括号的处理,就是递归进入计算括号内的字符串,得到括号内计算出来的结果作为当前的num

    • 此时i需要更新到对应的右括号的位置 i=j-1;

  • 当遇到的字符不是数字或者到达最后一个字符了,则需要将前面的运算符opt和num进行计算,然后存放进stack中,

    • 如果前面的运算符是'+',那么直接将 num 存进栈中

    • 如果前面的运算符是'-',那么将 -num存进栈中

    • 如果前面的运算符是'*', 那么将栈顶元素弹出进行运算 stack.pop() * num ,把计算结果存进栈中

    • 如果前面的运算符是'/',那么将栈顶元素弹出进行运算 stack.pop() / num ,把计算结果存进栈中

    • 更新当前运算符opt = c; num 重置为0;

最后将栈中的数字进行累加得到最终结果。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值