大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
成都创新互联从2013年创立,是专业互联网技术服务公司,拥有项目成都网站设计、网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元二七做网站,已为上家服务,为二七各地企业和个人服务,联系电话:028-86922220
#include stdlib.h
#include string.h
int errorflag;
typedef struct
{
double array[100];
int top;
}stack;
int isNumeric(char s) // 判断是不是数字
{
if(s='0's='告丛9' || s=='.')
return 1;
return 0;
}
int empty(stack* s) // 判断stack是不是为空
{
return s-top == 0;
}
void init(stack *s) // 初始化 stack
{
s-top = 0;
}
void push(stack* s, double a) // 入stack
{
s-array[s-top++] = a;
}
double pop(stack* s) // 出stack
{
if(!empty(s))
return s-array[--s-top];
}
double eval(char* s, char* e) // 解析算式
{
stack t;
double temp,temp2;
char *p, *q, *r;
int flag;
char op = '+';
init(t);
push(t,0);
while(se *s==' ') s++; // 清空前导 0
while(se *(e-1)==' ') e--; // 清空后导 0
if(s==e) return 0; // 空串 返回 0
p = s;
q = e;
for(;!errorflagpq;p++) // 历遍整个串
{
if(*p == ' ') continue; // 无视空格
else if(*p=='+' || *p == '-' || *p == '*' || *p == '/')
{
op = *p; // 更换操作纳早符
continue;
}
else
{
if(*p == '(') // 遇到左括号
{
r = p+1;
flag = 1;
while(flag)
{
p++;
if(p=e)
{
printf("\nError: ( and ) not matched.\n");
errorflag = 1;
q = s;
while(qe)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
if(*p=='(')
flag++;
if(*p==')') // 找到匹配的右括号
flag--;
}
temp = eval(r,p); // 括号内调用eval函数得到值
}
else if( *p == ')' )
{
printf("\nError: ( and ) not matched.\n");
errorflag = 1;
q = s;
while(qe)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
else if(isNumeric(*p)) // 如果是简单数字
{
sscanf(p,"%lf",temp); // 利用sscanf扫入数字
while(isNumeric(*p)) p++; // 指针偏移
p--;
}
else
{
printf("袜茄樱\nError: character not recognized.\n");
errorflag = 1;
q = s;
while(qe)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
if(op=='+') // 根据操作符入stack
push(t,temp);
else if(op=='-')
push(t,-temp);
else if(op=='*')
{
temp2 = pop(t);
temp2 *= temp;
push(t,temp2);
}
else if(op=='/')
{
if(temp == 0)
{
printf("\nError: divided by zero.\n");
errorflag = 1;
q = s;
while(qe)
{
putchar(*q);
q++;
}
putchar(10);
q = s;
while(q p)
{
putchar(' ');
q++;
}
printf("^\n");
break;
}
temp2 = pop(t);
temp2 /= temp;
push(t,temp2);
}
}
}
if(errorflag)
{
return -1;
}
temp = 0;
while(!empty(t)) // 统计stack内所有数之和
{
temp2 = pop(t);
temp += temp2;
}
return temp; // 返回总和
}
int main()
{
char s[1000];
int len;
double result;
while(gets(s))
{
errorflag = 0;
len = strlen(s);
result = eval(s,s+len);
if(!errorflag)
printf("%lf\n",result);
}
}