算式表达式(不转化逆波兰)

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


 

四 演示结果

 


  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值