栈的应用:中缀表达式计算(c语言)
作者:互联网
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define Min 1e-8
#define maxSize 10
int priority(char p){
if(p=='+'||p=='-'){
return 0;
}else{
return 1;
}
}
//子表达的计算
int calSub(float opand1,char op,float opand2,float &result){
//根据操作符进行计算
if(op == '*') result=opand1*opand2;
if(op == '+') result=opand1+opand2;
if(op == '-') result=opand1-opand2;
if(op == '/'){//若是除则需要判断除数为零的情况
if(fabs(opand2)<Min){// 浮点数没有准确的表达,只能用绝对值来表示差不多的范围
return 0;
}
else{
result =opand1/opand2;
}
}
return 1;
}
int calStackTopTwo(float s1[],int &top1,char s2[],int &top2){
float a=s1[top1--];//弹出栈顶元素后指针下移
float b=s1[top1--];
float result;
char op=s2[top2--];
int flag=calSub(b,op,a,result);//进行子表达式的计算
if(flag==0){
printf("被除数为零");
return 0;
}
s1[++top1]=result;//计算结果存入栈顶
return 1;
}
//计算表达式的函数
float getResult(char exp[]){
int i=0;//用于指向字符串(中缀表达式)的指针
//声明两个栈,一个float型,一个char型
//表达式中操作数存在一个栈内,运算符存入一个栈内
//top1,top2用于指向两个栈的栈顶
float s1[maxSize];int top1=-1;
char s2[maxSize];int top2=-1;
while(exp[i]!='\0'){//字符串结尾以'\0'
if(exp[i]>='0'&&exp[i]<='9'){//判断是否是数字,但此处只能判断0-9之间的一位数字
s1[++top1]=exp[i]-'0';//字符串转换为数字
++i;//下一个字符
}
else if(exp[i]=='(') {//如果是左括号的话直接进栈
s2[++top2]='(';
i++;
}else if(exp[i]=='*'|| //如果是运算符则进行以下判断
exp[i]=='/'||
exp[i]=='+'||
exp[i]=='-'){
//如果栈顶为左括号或者栈空,或者当前符号优先级大于栈顶符号优先级则入栈
if(s2[top2]=='('||top2==-1||priority(exp[i])>priority(s2[top2])){
s2[++top2]=exp[i];
i++;
}else{
int flag=calStackTopTwo(s1,top1,s2,top2);//当前运算符小于栈顶元素优先级则弹出数据栈的两个
if(flag==0){
return 0;
}
} //操作数,进行运算后存入栈顶,完毕后i的值不发生
} //变化
else if(exp[i]==')'){//如果碰到右括号,则弹出栈内直至左括号的所有运算符
while(s2[top2]!='('){//弹出一个运算符都需要进行计算
int flag=calStackTopTwo(s1,top1,s2,top2);
if(flag==0){
return 0;
}
}
--top2;//更新栈顶指针
i++;
}
}
//当表达式进栈完毕后
//只要符号栈内还有元素就继续进行运算
while(top2!=-1){
int flag=calStackTopTwo(s1,top1,s2,top2);
if(flag==0){
return 0;
}
}
return s1[top1];
}
int main(){
char s[10];
scanf("%s",s);//录入字符串
printf("%f",getResult(s));
}
代码运行截图:
笑看风声 发布了73 篇原创文章 · 获赞 31 · 访问量 1万+ 私信 关注标签:return,中缀,int,s2,top2,flag,opand2,表达式,语言 来源: https://blog.csdn.net/weixin_37716512/article/details/104093043