计算器c语言代码中缀表达式,栈的应用:中缀表达式计算(c语言)

#include

#include

#include

#include

#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)

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));

}

代码运行截图:

5664f2220918c934ff2fe6fc33354872.png

2b056401924b388ca3c2d4e7d31ebd7a.png

068be7e19a8fd7ea1cc73db7ddbb42c1.png

笑看风声

发布了73 篇原创文章 · 获赞 31 · 访问量 1万+

私信

关注

标签:return,中缀,int,s2,top2,flag,opand2,表达式,语言

来源: https://blog.csdn.net/weixin_37716512/article/details/104093043

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值