字符串四则运算

	
	简单四则运算:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值:注:
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式不会出现0作为除数
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
	采用栈可以很方便的实现,而通常的栈,我们可以用数组来模拟。
	通过一个例子来说明算法过程:1+4*5/5-8/3
	1.首先把1入栈,则stack[0]=1
	2.定位到+,把+4入栈,则stack[1]=+4;
	3.定位到*,改变栈顶元素,则stack[1]=stack[1]*5=+20;
	4.定位到/,改变栈顶元素,则stack[1]=stack[1]/5=+4.
	     5.定位到-,把-8入栈,则stack[2]=-8
	     6.定位到/,改变栈顶元素,则stack[2]=-8/3=-2.
		最后把栈中元素相加:
	stack[0]+stack[1]+stack[2]=1+4+(-2)=3
通过sscanf,和strpbrk这两个 函数可以很方便实现。
/*
头文件
#include<stdio.h>
int sscanf(const char *buffer,const char *format,[argument ]...);
参数:	buffer存储原始数据
		format格式控制字符串
		argument 选择性设定字符串
功能:sscanf会从buffer里读进数据,依照format的格式将数据写入到argument里。

返回值:成功则返回参数数目,失败则返回-1,错误原因存于errno中。
__________________________________________________________
用法:#include <string.h>
原型:char *strpbrk(const char *s1, const char *s2);
功能:依次检验字符串s1中的字符,当被检验字符出现在字符串s2中时,
		停止检验,并返回该字符位置,空字符NULL不包括在内。
说明:返回s1中第一个满足条件的字符的指针,如果没有匹配字符则返回空指针NULL。
用途:在源字符串(s1)中找出最先含有搜索字符串(s2)
	中任一字符的位置并返回,若找不到则返回空指针。

*/



转载请标明出处:http://blog.csdn.net/lin200753/article/details/29380651
int calculate(char *expStr)
{
	int sum=0;
	int adstack[100];
	int top=-1;	
	int numtemp,i;	
	char *cur;		
	cur=strpbrk(expStr,"+-*/");	//要防止第一个数有符号,如-1+3;
	if(cur==expStr)
	{
		cur=strpbrk(cur+1,"+-*/");	
	}	
	sscanf(expStr,"%d",&adstack[++top]);
	while(cur!=NULL)
	{
		if(*cur=='+'||*cur=='-')//相当于直接入栈
		{
			sscanf(cur,"%d",&adstack[++top]);	
		}
		else if(*cur=='*')//改变栈顶元素
		{
			sscanf(cur+1,"%d",&numtemp);
			adstack[top]*=numtemp;
		}
		else if(*cur=='/')//改变栈顶元素
		{
			sscanf(cur+1,"%d",&numtemp);
			adstack[top]/=numtemp;
		}
		cur=strpbrk(cur+1,"+-*/");			
	}
	for(i=0;i<=top;i++)//栈中元素求和。
		sum+=adstack[i];	
	return sum;
	
	
		
}

void main()
{
    //char *expStr = "1+4*5/5-8/3";//19
   char expStr[]="2 +4/2*3-8";//0
   // char *expStr = "-1+4*5-8/3";//17
    int ret=calculate(expStr);
    printf("ret=%d\n",ret);
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值