leetcode 刷题 227.基本计算器

基本计算器(没有括号,但有乘除)

227. 基本计算器 II
这道题我踩了好多个坑,最近学习状态不佳,写力扣的时候没有很专注,先说说犯的错误

  • ==这种低级错误
  • 最后算求和的时候拿s[i]…而不是stk[i]
  • top那里如何计数非常模糊,后面拿例子顺了一遍

我们再说说这道题要怎么写吧
首先,它没有括号,所以我们可以直接按顺序加减就好了,至于乘除,我们可以在线处理一下,把前一个数字拿出来做乘除计算再放回栈中
具体实现如下:
①读入数字则将字符串类型化为整数,注意一下溢出的问题
②如果读入了一个符号,或者是循环已经到了字符串末尾,则把前面的num放入栈中(num的符号由preSign决定),如果preSign是乘除,则需要将栈顶元素取出与num做计算再放回去,这里需要注意,top的值没有改变,它在上一个循环已经+1,这时候如果需要取出栈顶元素,需要-1
③最后将栈里面元素求和时候,要注意是<top,因为放入最后一个元素时候top++了,这道题弄清top的值是重点
④如果一开始是-5这种负数怎么办???我们一开始就将preSign设为‘+’,num设为0,所以当读取到负号的时候,0入栈,而0对后面循环求和没有影响

int calculate(char * s){
    int n=strlen(s);
    int stk[n],top=0;
    char preSign='+';
    int num=0;
    int i;
    for(i=0;i<n;i++)
    {
        if(isdigit(s[i]))
        {
            num=10*num+(int)(s[i]-'0');
        }
        if((!isdigit(s[i])&&s[i]!=' ')||i==n-1)
        {
            switch(preSign)
            {
                case '+':
                stk[top++]=num;
                break;
                case '-':
                stk[top++]=-num;
                break;
                case '*':
                stk[top-1]*=num;
                break;
                default:
                stk[top-1]/=num;
                break;

            }
            preSign=s[i];
            num=0;
        }
    }
    int res=0;
    for(i=0;i<top;i++){
        res+=stk[i];

    }
    return res;


}

基本计算器②(有括号没有乘除)

224.基本计算器
这道题的思路就是我们需要维护一个栈 ,其中栈顶元素记录了当前位置所处的每个括号外的符号。
然后这道题我做的时候没有思路,完全是照着官方解答来写的,自己看完官解之后再写的时候出现了一个问题。
栈内既然存放的是符号,那么我们就要及时的做计算,怎么样读完一个数就计算呢,上一个计算器的题目是把要计算的数存放进堆栈。
解决的方法是外面一个while循环去读字符串中的每一个字符,如果遇到符号,是‘+’,‘-’的话,更新sign(当前符号的状态),是‘(’的话,更新栈顶元素的状态,如果读入一个数字,则等数字读完之后马上计算,这要求里面再放一个while循环,去读入数字,等循环结束开始计算。
栈顶元素是根据这个括号前一个符号和上一个括号的正负状态决定的,所以要由stk[top-1]和上一个sign决定。

int calculate(char * s){
        int n;
        n=strlen(s);
        int stk[n],top=0;
        int sign=1,num=0;
        stk[top++]=sign;
        int i,ret=0;
        while(i<n)
        {
            if(!isdigit(s[i]))
            {
                switch(s[i])
                {
                    case' ':i++;break;
                    case'+':sign=stk[top-1];i++;break;
                    case'-':sign=-stk[top-1];i++;break;
                    case'(':stk[top++]=sign;i++;break;
                    default:top--;i++;break;
                }
            }
            else
            {
                while(i<n&&s[i]>='0'&&s[i]<='9')
                {
                    num=num*10+(int)(s[i]-'0');
                    i++;
                }
                ret+=sign*num;
                num=0;
            }
        }
        return ret;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值