简单四则运算:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值:注:
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);
}