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) 补全函数的逻辑正确吗?,不正确希望帮忙指出来,还有是否有更简单的方式, 对一个数字入栈,和我的将二维数组拷贝到一维数组时否正确?
你是怎么确定左括号的位置的