zl程序教程

您现在的位置是:首页 >  其它

当前栏目

227. 基本计算器 II--栈用法

-- 用法 基本 II 计算器
2023-09-14 09:06:52 时间

227. 基本计算器 II

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

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

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

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

示例 1:

输入:s = “3+2*2”
输出:7

示例 2:

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

示例 3:

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

这题博主做的稍微复杂了一些,原理就是,先把乘除解决了,之后我们再去按顺序解决加减的数据:
解题代码如下:

int num_tr(char *s,int *index){
    long long num=0;
    long long i=*index;
    while(s[i]==' '){
        i++;
    }
    for( ;s[i]!='\0';i++){
        if(s[i]>='0'&&s[i]<='9'){
            num=num*10+s[i]-'0';

        }
        else{
            break;
        }


    }
   *index=i;
    return num;
}

int calculate(char * s){
    int len=strlen(s);
    long long stack_num[len];
    int num_top=0;
    char stack_s[len];
    int s_top=0;
  
    int *index=(int *)malloc(sizeof(int));
    for(int i=0;s[i]!='\0';){
        if(s[i]==' '){
            i++;
            continue;
        }
        if(s[i]>='0'&&s[i]<='9'){
            *index=i;
            int num=num_tr(s,index);
            i=*index;
            stack_num[num_top++]=num;
          //  printf("| %d ",num);
        }
        else{

           if(s[i]=='*'){
               long long prenum=stack_num[--num_top];
              *index=i+1;
               long long backnum=num_tr(s,index);
                i=*index;
                stack_num[num_top++]=prenum*backnum;


           }
           else if(s[i]=='/'){
              long long prenum=stack_num[--num_top];
              *index=i+1;
               // printf("%s --",s+i);
            
               long long backnum=num_tr(s,index);
                // printf("%d %c --",backnum,s[i+1]);
                i=*index;
                stack_num[num_top++]=prenum/backnum;

           }
           else{
               stack_s[s_top++]=s[i];
                  i++;

           }
        
        }
    }
  
    int p=0;
    int re=stack_num[0];
     for(int i=0;i<s_top;i++){
         char sign=stack_s[i];
        
         if(sign=='+'){
             
             long long b=stack_num[++p];
              re=re+b;

         }
           if(sign=='-'){
           
             long long a=stack_num[++p];
              re=re-a;


         }
       
    }
    return re;
}