C语言实现加减乘除(可以带括号,浮点数)计算器

#include<stdio.h>
#include<stdlib.h>
#define M 500
struct sqstack  //定义储存运算符的栈
{
  char data[M];
  int top;
};
int initstack(struct sqstack *s)  //构造一个空栈
{
  s->top=-1;
  return 1;
}
int stackempty(struct sqstack *s)   //判栈空
{
return((s->top==-1)? 1:0);
}
int stackfull(struct sqstack *s)    //判满栈
{
return((s->top==M-1)? 1:0);
}
int push(struct sqstack *s,char e)   //入栈
{
  if(stackfull(s))
 return 0;
  s->top++;
  s->data[s->top]=e;
  return 1;
}
char pop(struct sqstack *s)    //出栈
{
char e;
  if(stackempty(s))
 return 0;
  e=s->data[s->top];
  s->top--;
  return e;
}
char gettop(struct sqstack *s)   //得到栈顶元素
{
char e;
  if(stackempty(s))
 return 0;
  e=s->data[s->top];
  return e;
}
float mi(int x,int y)    //求x的y次幂
{
   float n;
   if(y==0)
  n=1;
  if(y>0)
     n=mi(x,y-1)*x;
  if(y<0)
 n=mi(x,y+1)/x;
  return n;
}
float operate(float a,float b,char ch)   //运算操作
{
  if(ch=='+')
      return a+b;
  else if(ch=='-')
 return a-b;
  else if(ch=='/')
      return a/b;
  else if(ch=='*')
 return a*b;
  else
 return 0;
}
int isoperate(char ch)  //判断运算符
{
  if(ch=='('||ch==')')
  return 1;
  else if(ch=='+'||ch=='-')
 return 1;
  else if(ch=='*'||ch=='/')
      return 1;
  else
 return 0;
}
int isnum(char ch)  //判断数字
{
  if((ch>='0'&&ch<='9')||ch=='.')
 return 1;
  else
 return 0;
}
char precede(char a,char b)  //判断优先级
{
   if(a=='+'||a=='-')
   {
     if(b=='*'||b=='/')
return '<';
else if(b=='(')
return '<';
     else
return '>';
   }
  else if(a=='*'||a=='/')
  {
    if(b=='(')
return '<';
else
        return '>';
  }
  else if(a=='(')
  {
    if(b==')')
     return '=';
else
return '<';
  }
  else if(a==')')
  return '>';
  else if(a=='#')
  {
    if(b=='#')
return '=';
    else
return '<';
  }
  else
 return 0;
}
int check(char c)    //得出某运算符前面还有几个运算符
{
  if(c=='+'||c=='-')
  return 1;
  else if(c=='*'||c=='/')
  return 1;
  else
 return 0;
}
int main()
{
  struct sqstack S;
  char a[M];     //存储输入
  char ch='c';
  char b[M];     //存储运算符
  char c[M];     //存储数据
  char cn='A',theta;    //theta存放运算符
  float d[M];   //存放数据
  int i=0,j;
  int m=0;       //统计运算符数量
  int n=0;     //存放键盘输入字符数
  int k=-1;
  int flag=1000;    //浮点数分别实数标志
  float x=0;         //临时存放数据变量
  int y=0;           //在浮点型与
  int z=0;         //统计数据数目
  int count=0;     
  float a1=0.0,b1=0.0;
  initstack(&S);
  while(ch!='\n')    //输入放到数组a
  {
ch=getchar();
a[i]=ch;
i++;
  }
   for(j=0;j<i-1;j++)
  {
ch=a[j];
    if(isoperate(ch))
{
b[m]=ch;         //运算符放到数组b
m++;
}
    if(isnum(ch))
    {
c[n]=ch;         //存放0到9以及小数点,每一个数据输入一个空格
n++;
   if(isoperate(a[j+1]))
{
c[n]=' ';
n++;
}
}  
  }
     c[n]=' ';
   for(j=0;j<n+1;j++)
   {
      if(c[j]=='.')   
 flag=j;        //小数点位置
 if(flag!=1000&&c[j]==' ')   
 {
     for(i=k+1;i<j;i++)       //浮点数
 {
    if(i<flag&&c[i]>48)
   x=x+mi(10,flag-i-1)*(c[i]-48);
    if(i>flag&&c[i]>48)
   x=x+mi(10,flag-i)*(c[i]-48);
    k=j;
 }
     d[z]=x;        //数据放入数组d
     x=0.0;     //x重新置0
 z++;       
 flag=1000;    
 y=1;
 }
      if(flag==1000&&c[j]==' '&&y==0)    //实数
 {  
 for(i=k+1;i<j;i++) 
 {
 x=x+mi(10,(j-i-1))*(c[i]-48);
         k=j;
 }
 d[z]=x;
 x=0.0;
 z++;
 }
 y=0;
   }
   b[m]='#';
   push(&S,'#');
   i=0;
   ch=b[i++];   //读取运算符
   while(ch!='#'||gettop(&S)!='#')   
   {
     switch(precede(gettop(&S),ch))
{
  case '<':        //栈顶运算符优先级低
{
push(&S,ch);
    ch=b[i++];
    break;
}
  case '=':         //优先级相同

cn=pop(&S);
             ch=b[i++];
    break;
}
  case '>':         //栈顶优先级高

theta=pop(&S);
j=S.top;
count=0;
 for(n=0;n<=j;n++)
 {
if(check(S.data[n]))
count++;
 }
a1=d[count];    //读入数据
                 b1=d[count+1];
d[count]=operate(a1,b1,theta);
             for(;count<z-2;count++)
d[count+1]=d[count+2];   //向前覆盖数据
    break;
}
}
   }
   printf("%.2f\n",d[0]);    
   system("PAUSE");
  return 0;
}

猜你喜欢

转载自blog.csdn.net/fight_snail/article/details/79512218