一 算式表达式
用字符串输入一段合法的表达式,比如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>
四 演示结果