【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
【功能设计】
1. 实现中缀转后缀
2.实现标准整数类型的四则运算表达式的求值
【逻辑设计】
1. 如果是数字则直接将数字拿出去
if(isNum(ch)){
j = i;
k = 0;//重置k
//拼接数字
while(isNum(msg[j])){
arr[k++] = msg[j];
j++;
}
arr[k] = '\0';
i = j - 1;
a = atoi(arr);//调用atoi方法,从而将这个多位数字的字符串转成整形数字
count++;
if(count == 1)
printf("%d",a);//如果是第一个数字,那么前面不需要输出一个空格,否则要在前面输出空格
else
printf(" %d",a);
push(num,a);//将数字压入栈中
}
2.如果是运算符则分情况讨论
else{
//当前的字符不是一个左括号,那么需要判断当前的符号是否为一个右括号
if(ch == ')'){
getFuTop(fu,&tmp);
while(tmp != '('){
popFu(fu,&tmp);
printf(" %c",tmp);
if(!yunsuan(tmp,num,&result)){
printf("被除数不可以为0,运算错误!!!\n");
return;
}
push(num,result);//如果运算符合运算法则,那么将运算结果压入到栈中
getFuTop(fu,&tmp);
}
popFu(fu,&tmp);
}else{
//当前的符号是一个普通符号,那么需要比较优先级
label:
if(isFuEmpty(fu) || level(ch) > level(tmp)){
//当前符号的优先级大于栈顶符号的优先级,那么直接入栈
pushFu(fu,ch);
}else{
//当前的符号的优先级小于等于栈顶符号的优先级,那么将栈顶元素从fu栈中跳出并输出
popFu(fu,&tmp);
printf(" %c",tmp);
if(!yunsuan(tmp,num,&result)){
printf("被除数不可以为0,运算错误!!!\n");
return;
}
push(num,result);//如果运算符合运算法则,那么将运算结果压入到栈中
getFuTop(fu,&tmp);
goto label;//利用goto语句,从而实现当前的符号的优先级小于栈顶符号的优先级,然后将其压入
}
}
}
}
3.运算符优先级设定
int level(char ch){
if(ch == '+' || ch == '-')
return 1;
else if(ch == '*' || ch == '/')
return 2;
else
return 0;
}