补全括号表达式问题

TODO:完成给表达式补充左括号的功能。
函数功能:将一个缺少左括号的表示式,转换成补全左括号的中序表达式。
参数说明: express-需要被转换的缺少左括号的表达式。只允许为数字、空格、+、-、*、/、),长度不得超过MAX

      result补全左括号后的中序表达式。转换时,需要将空格过滤掉。即:result中不会出现空格字符。

返回值说明:true-如果能成功转换,则返回true。

        false-否则,返回false。表示转换出错或输入的表达式非法。

举例说明: 1、express="123 + 123",是一个正确的表达式,且有空格,因此,转换后,result="123+123"

       2、express="123 + 123)",且有空格,因此,转换后,result="(123+123)"
       3、express="1+2)*3-4) *5-6 ) ) )",且有空格,因此,转换后,result="((1+2)*((3-4)*(5-6)))"
       4、express="12-3**3)",是非法的表达式,有两个连续的**,函数返回false;
       5、express="12-3*",是非法的表达式,*后面没有操作数了,函数返回false;
       6、express="12-3*5 5*3)",是非法的表达式,操作数5与5之间,缺少操作符,函数返回false;
       等等。

数据类型;

#define MAX 50;
typedef struct Stack{
    char data[MAX][MAX*2]; //用来保存数据
    int top; //用来记录栈顶位置,初始值为-1,为0时表示该栈中有一个元素。
}Stack;

初始化栈;

void  initStack(Stack* s){ ;
    s->top = -1;
}
void Push(Stack*s, char*data){  //入栈;
    s->top++;
    strcpy(s->data[s->top], data);
}
char* Pop(Stack*s){   //出栈;
    return s->data[s->top--]; //返回为一个二维数组的行首地址;
}

函数

bool completeParentese(char* express, char* result){
         Stack ops ,vals;    //建立一个符号栈,一个操作符栈;
         int i=0  ,n ,j,k,m;
         char expre[50];  //接收上数字和再次压入栈内的()表达式;
             while(express[i]!='\0')
             {
                    if(express[i]=='+' || express[i]=='-' || express[i]=='*' ||express[i]=='/')   // 为操作符时,;入栈
                          Push(&ops ,&express[i]);
                    
                    else if('0'<=express[i] && express[i]<='9')
                    {
                          j=i;
                          k=0;
                          while('0'<=express[j] && express[j]<='9') //当操作数为123 这样的类型时;
                          {
                              expre[k]=express[j] ;
                              j++;
                              k++;
                          }
                          Push(&vals , expre);  //将数字压入栈;
                    }
                    else if(')')   //当遇到 ')' 
                    {
                         //取一个操作符加一个操作数 + '()'构成 新的操作数;
                          expre[0]='(';
                          n= strlen(Pop(&vals));   //操作数;
                          strcpy( &express[1] , Pop(&vals));
                          expre[n+1]=Pop(&ops);  //
                          strcpy(Pop(  &express[n+2] , Pop(&vals) );  //操作数;
                           m=strlen(Pop(&vals));
                           express[n+m+3]=')' ;
                          Push(&ops,expre);
                    }
                    i++;
             }
             i=0;
             n=0;
             // 以符号栈是否用完和数字栈第一个是否为'(' 判断是否为非法栈;
             if(ops.top==-1  && vals.data[0][0]=='(' )
             {
                    //将操作栈中的值拷贝到result[]中; 
                     while(vals.top!=-1)
                     {

                                       strcpy( &result[n] , vals.data[i]  );
                                       n=strlen(vals.data[i]) ;
                                       i++;
                     }

             }
             if(i==0)
             return false;
             else 
             return true;
}

调用;

int main(){
    printf("请输入缺少左括号的表达式.\n");
    char express[MAX]={0};
    char result[MAX*2]={0};
    gets(express);  //输入express;
    bool bResult = completeParentese(express, result);
    if(bResult){
        printf("补齐左括号之后的表达式为:%s\n", result);
    } else{
        printf("转换失败,输入的表达式可能不合法");
    }
    return 0;
    }

我想问一下我的 bool completeParentese(char express, char result) 补全函数的逻辑正确吗?,不正确希望帮忙指出来,还有是否有更简单的方式, 对一个数字入栈,和我的将二维数组拷贝到一维数组时否正确?

阅读 2.6k
1 个回答
"1+2)*3-4) *5-6 ) ) )",且有空格,因此,转换后,result="((1+2)*((3-4)*(5-6)))"

你是怎么确定左括号的位置的

result="(((((1+2)*3-4) *5-6)))"
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进