一 算式表达式
用字符串输入一段合法的表达式,比如1+2*(3+4)/5-6,然后通过一系列的操作,算出val=1
二 分析
在上一篇博客中其实已经用到这思路——栈,我先转化为逆波兰表达式,在对逆波兰表达式进行计算,这次只用了栈的思想并且直接对其直接计算,给数字创建一个数组,给运算符也创建一个数组,逐个读取字符,通过if,else if对每一个字符进行处理,用数字的大小来确定运算符的优先级,在最后字符读取完之后,如果栈没有空,重复上述的操作
三 代码
<span style="font-size:18px;">#include<stdio.h> #include<stdlib.h> #include<conio.h> int level(char op) //比较优先级 { int i; switch(op) { case'(':i=1;break; case'+':i=2;break; case'-':i=2;break; case'*':i=3;break; case'/':i=3;break; case'#':i=0;break; } return i; } int calculate(char op,int x1,int x2)//计算2个数的值 { int i; switch(op) { case'*':i=x2*x1;break; case'/':i=x2/x1;break; case'-':i=x2-x1;break; case'+':i=x2+x1;break; } return i; } int progress(char s[]) //字符的处理过程 { char *p; char sop[50]; int y,tnum,op,x1,x2,top,snum[50]; top=0,tnum=-1,sop[top]='#'; </span><span style="font-size:18px;">p=s; // 让p指向s的首地址 while(*p) // 逐个读取字符 { if(*p>='0'&&*p<='9') // 将字符数字转化成整型 { y=0; while(*p>='0'&&*p<='9') { y=y*10+*p-'0'; p++;//*p++ } snum[++tnum]=y; } else if(*p=='+'||*p=='-'||*p=='*'||*p=='/') { while(level(*p)<=level(sop[top]))//当前的运算符和数组的字符优先级比较 { op=sop[top--]; x1=snum[tnum--]; x2=snum[tnum--]; snum[++tnum]=calculate(op,x1,x2); } sop[++top]=*p++; } else if(*p=='(')//如果是(直接进栈 { sop[++top]='('; p++;//*p++ } else if(*p==')') { while(sop[top]-'(') //在遇到(之前不停的循环 { op=sop[top--]; x1=snum[tnum--]; x2=snum[tnum--]; snum[++tnum]=calculate(op,x1,x2); } top--; p++; } else //否则就进行下一个 p++; } while(sop[top]-'#') //将栈中剩下的全部计算知道遇到# { op=sop[top--]; x1=snum[tnum--]; x2=snum[tnum--]; snum[++tnum]=calculate(op,x1,x2); } return snum[tnum]; } int main(void) // 主函数 { char s[100]; int val; printf("请你输入要计算的表达式:\n"); gets(s); val=progress(s); printf("表达式的值:val=%d",val); getch(); getch(); return 0; } </span>
四 演示结果