2301_79683887 2023-10-05 17:32 采纳率: 70.6%
浏览 16
已结题

有一个测试点显示运行时错误,怎么修改?

img


#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<ctype.h>
#define Max 21
typedef struct Node{
char data[Max];
   int top;
}NODE,*pNODE;
typedef enum{
  a,b,c,d,e,f,g,h
}Pre;
Pre Get(char op){
  switch(op){
    case '(':return a;
    case ')':return b;
    case '+':return c;
    case '-':return d;
     case '*':return e;
     case '/':return f;
    case '\0':return g;
     default:return h;
  }
}
//初始化
void init(pNODE pS){
   pS->top=-1;
}
//入栈
bool add(pNODE pS,int val){
    if(pS->top==Max-1){
        return false;
    }
   pS->top++;
   pS->data[pS->top]=val;
    return true;
}
//出栈
bool delete(pNODE pS, char *pVal){
     if(pS->top==-1){
        return false;
    }
   *pVal=pS->data[pS->top];
   pS->top--;
   return true;
}
//访问栈顶元素
char peek(pNODE pS){
    char Val;
    Val=pS->data[pS->top];
    return Val;
}
//判断是否为空
bool empty(pNODE pS){
 if(pS->top==-1)
    return true;
 else
    return false;
}
//判断是正负号还是运算符
bool IsSign(char* str,int i){
    //如果前一个字符不是数字也不是右括号,则是正负号
    //表达式第一个字符 正负号
  if(!i||(!isdigit(str[i-1])&&(str[i-1]!=')'))){
        return true;
  }
  else return false;//是运算符

}
char GetOp(char* str,int *i,char *str1,int *j){
  if(isdigit(str[(*i)])){
        //执行循环前说明此时字符已经是数字,进入循环,如果下一个字符是数字,说明是一个十位数,则不加空格,是小数点说明这个数是小数,中间不加空格
    while(isdigit(str[(*i)])||(str[(*i)])=='.'){
        str1[(*j)++]=str[(*i)++];
    }
        str1[(*j)++]=' ';
        //再表达式转换函数中,遇到数字不执行,直接跳出循环,所以i要减一,否则在表达式转换函数中又再for循环中加了一次,这样就会加了两次
        (*i)--;
       // printf("%d\n",(*i));
        return '0';
  }
  switch(str[(*i)]){
  case '+':
    if(IsSign(str,(*i))){
        (*i)++;
        return GetOp(str,i,str1,j);}
    else return '+';
  case '-':
    if(IsSign(str,(*i))){
            str1[(*j)++]='-';
             (*i)++;
               return GetOp(str,i,str1,j);}
               else return '-';
  default:
    return str[(*i)];

  }

}
void convert(char* str){
    char str1[Max*2];
    int j=0;
    char val;
    char token;
    int len=strlen(str);
    pNODE S=(pNODE)malloc(sizeof(NODE));
     if(S == NULL) return false; //分配失败
     init(S);
     for(int i=0;i<len;i++){
            token=GetOp(str,&i,str1,&j);
     Pre op=Get(token);
     if(op==h)continue;
     switch(op){
        case a:add(S,'(');
                break;
        case b:while(peek(S)!='('){
                     delete(S,&val);
                     str1[j++]=val;
                     str1[j++]=' ';
                     }
                     delete(S,&val);
                     break;
        default:
            //当前运算符优先级小于等于栈顶运算符优先级,直接出栈并输出
            while(!empty(S)&&peek(S)!='('&&op<=Get(peek(S))){
                     delete(S,&val);
                     str1[j++]=val;
                     str1[j++]=' ';
                  }
                  add(S,str[i]);//当前运算符大于栈顶运算符,压栈
                  break;

     }
     }
     //中缀表达式对象处理完毕栈中剩余元素输出
     while(!empty(S)){
         delete(S,&val);
        str1[j++]=val;
        str1[j++]=' ';
     }
     str1[j-1]='\0';
     printf("%s",str1);
}
int main()
{
    char str[Max]={0};
   gets(str);
   int len=strlen(str);
   convert(str);
    return 0;
}

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-05 20:06
    关注

    【相关推荐】



    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7645073
    • 这篇博客你也可以参考下:有一个数组,删除数组中的重复的元素,怎么实现?
    • 您还可以看一下 刘伶华老师的软件测试经典面试题剖析课程中的 工作中有遇到什么困难,怎么解决的?小节, 巩固相关知识点
    • 除此之外, 这篇博客: 浮点数的表示方法中的 浮点数为什么有精度损失? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      我们再来看一下,平时经常听到的浮点数会有精度损失的情况是怎么回事?

      如果我们现在想用浮点数表示 0.2,它的结果会是多少呢?

      0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止,在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。

      0.2 * 2 = 0.4 -> 0
      0.4 * 2 = 0.8 -> 0
      0.8 * 2 = 1.6 -> 1
      0.6 * 2 = 1.2 -> 1
      0.2 * 2 = 0.4 -> 0(发生循环)
      ...
      

      所以 0.2(D) = 0.00110…(B)。

      因为十进制的 0.2 无法精确转换成二进制小数,而计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 10月5日