1、改进1:对中缀转后缀表达式的函数进行改进,生成后缀表达式时,在原来的基础上,各个符号和数字之间增加了空格,比较直观,便于计算:
改进后:
/*中缀表达式转后缀表达式
中缀表达式之间无分割
后缀表达式操作数、操作符之间用空格分割,便于区分不同操作数*/
void infix_to_suffix(char* infix, char* suffix) {
int i, k, j=0, top=0;
char stack[1000];//存储运算符的栈
for(i=0; infix[i]!=‘\0‘; i++) {
if(infix[i] >= ‘0‘ && infix[i] <= ‘9‘) {
suffix[j++] = infix[i];//操作数则直接输出
} else {
if(i != 0 && infix[i-1] >= ‘0‘ && infix[i-1] <= ‘9‘) {
suffix[j++] = ‘ ‘;//操作数后补充空格分割
}
if(infix[i] == ‘)‘) {
//遇到右括号则一直弹出直到左括号,但左括号不输出
while(stack[top-1] != ‘(‘) {
suffix[j++] = stack[--top];
suffix[j++] = ‘ ‘;
}
top--;
} else if(top == 0 || mycmp(stack[top-1], infix[i])) {
//栈为空或当前操作符的优先级高于栈顶操作符,当前操作符入栈
stack[top++] = infix[i];
} else {
//当前操作符优先级等于或低于栈顶操作符则弹出栈顶
while(!mycmp(stack[top-1], infix[i])) {
suffix[j++] = stack[--top];
suffix[j++] = ‘ ‘;
if(top == 0)
break;
}
stack[top++] = infix[i];//当前操作符入栈
}
}
}
//补充空格分割
if(suffix[j-1] != ‘ ‘) {
suffix[j++] = ‘ ‘;
}
//如果操作符栈不为空,弹出所有操作符
while(top != 0) {
suffix[j++] = stack[--top];
suffix[j++] = ‘ ‘;
}
suffix[j] = ‘\0‘;
}
改进2:优化文件输出 直接将保存结果存到字符串中 一次性输出
改进后:
switch(z){
case 0:{
strcat(str,"+");
break;
}
case 1:{
strcat(str,"-");
break;
}
case 2:{
strcat(str,"*");
break;
}
case 3:{
strcat(str,"/");
break;
}
case 4:{
strcat(str,"^");
break;
}
}
2、性能分析
(1)、解10000道题所耗费时间

函数的消耗


可见求解表达式值的时候消耗最大的函数为中缀转后缀表达式函数;
(2)、生成10000道题所消耗的时间

函数的消耗


可见生成题目时消耗最大的函数为题目生成 函数
原文:https://www.cnblogs.com/szys/p/9026031.html