前言
不同表达式的计算
正文
首先还是需要知道一下关于中缀转前后缀的方法
具体参考转换方法
以 (5+2+1✖3)/5 为例
后缀:52+13*+5/
前缀:/++52*135
其中,中缀和后缀表达式的计算是重点,前缀和后缀计算类似,具体参见代码
代码
#include <stdio.h>
#include <string.h>
double cal_suffix(char *str);
double cal_preffix(char *str);
double Cal_fix( char str[]);
int main(){
char str[]="52+13*+5/";
char str2[]="/++52*135";
char str3[]="(5+2+1*3)/5";
printf("%.f\n",cal_suffix(str));
printf("%.f\n",cal_preffix(str2));
printf("%.f",Cal_fix(str3));
}
double cal(double a,double b,char c){ //计算两数
switch(c){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case'/':return a/b;
}
}
int operate(char c){ //判断是否为操作符
switch(c){
case '+':return 1;case '-':return 1;case '*':return 1;
case'/':return 1;default :return 0;
}
}
前缀计算
double cal_preffix(char *str){
double a,b,result=0,stack[100];
int i=0,top=-1;
for(i=strlen(str)-1;i>=0;i--){//从右往左
if(!operate(str[i])){ //如果是数字则进栈
stack[++top]=str[i]-'0';
}
else{
a=stack[top--]; //取出栈顶元素
b=stack[top--]; //取出栈顶元素
result=cal(a,b,str[i]); //二目运算
stack[++top]=result; //计算结果入栈
}
}
return result;
}
中缀计算
double Cal_fix( char str[]){
double stack1[200];//存放数字栈
char stack2[100];//存放字符栈
int top1=-1,top2=-1,i=0;
char a;
double b,c;
while(str[i]!='\0'){
if(str[i]=='+'||str[i]=='-'){
if(top2==-1){ //栈中没有运算符,则入栈
stack2[++top2]=str[i];
}
else{
while(stack2[top2]=='+'||stack2[top2]=='-'||stack2[top2]=='*'||stack2[top2]=='/'){
a=stack2[top2--]; //栈2顶的运算符弹出
c=stack1[top1--]; //取出一个数字
b=stack1[top1--]; //取出一个数字
stack1[++top1]=cal(b,c,a); //运算结果入栈
printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
}
stack2[++top2]=str[i]; //运算结束,字符入栈2
}
}
else if(str[i]=='*'||str[i]=='/'){
if(top2==-1){
stack2[++top2]=str[i];
}
else{
while(stack2[top2]=='*'||stack2[top2]=='/'){
a=stack2[top2--];
c=stack1[top1--];
b=stack1[top1--];
stack1[++top1]=cal(b,c,a);
printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
}
stack2[++top2]=str[i];
}
}
else if(str[i]=='('){ //如果是左括号直接入栈
stack2[++top2]=str[i];
}
else if(str[i]==')'){ //如果是右括号,则计算第一个左括号内的所有操作符,最后将此左括号弹出
while(stack2[top2]!='('){
a=stack2[top2--];
c=stack1[top1--];
b=stack1[top1--];
stack1[++top1]=cal(b,c,a);
printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
}
stack2[top2--]; //弹出左括号
}
else //不是操作符直接入栈1
stack1[++top1]=str[i]-'0';
i++;
}
while(top2!=-1){ //遍历如果栈不为空。计算剩下操作符
a=stack2[top2--];
c=stack1[top1--];
b=stack1[top1--];
stack1[++top1]=cal(b,c,a);
printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
}
return stack1[top1]; //返回结果
}
后缀计算
double cal_suffix(char *str){
double a,b,result=0,stack[100];
int i=0,top=-1;
while(str[i]!='\0'){//从左往右
if(!operate(str[i])){
stack[++top]=str[i]-'0';
}
else{
b=stack[top--];
a=stack[top--];
result=cal(a,b,str[i]);
stack[++top]=result;
}
i++;
}
return result;
}