利用栈进行表达式求解

采用栈的思想,对输入的字符串表达式进行求解。

#include<stdio.h>

double num[100];
int nt=0;
double oper[50];
int ot=0;

char opset[7]={'+','-','*','/','(',')','='};
unsigned char prior[7][7] = {     //  算符间的优先关系
   '>','>','<','<','<','>','>',
   '>','>','<','<','<','>','>',
   '>','>','>','>','<','>','>',
   '>','>','>','>','<','>','>',
   '<','<','<','<','<','=',' ',
   '>','>','>','>',' ','>','>',
   '<','<','<','<','<',' ','='
};

char compare(char c1,char c2)    //比较两个运算符c1,c2的优先级
{
    int i1=0,i2=0;
   while(opset[i1]!=c1&&i1<7)
    {
           i1++;
    }
   while(opset[i2]!=c2&&i2<7)
    {
           i2++;
    }
   return prior[i1][i2];
}

double cal(double n1,double n2,char c) //计算n1与n2的c运算
{
    switch(c)
    {
        case'+': return n1+n2;
        case'-': return n1-n2;
        case'*':return n1*n2;
        case'/':return n1/n2;
    }
}

double Value()
{
    char c;
    int flag=1;
    int isin=-1;
    double time=10;
    double temp=0;

    oper[ot++]='=';
    c=getchar();
    while(ot>0)    //循环读入字符并进行运算
    {
        isin=-1;
        temp=0;
        flag=1;
        time=10;
        while((c>='0'&&c<='9')||c=='.')   //读入数字的情形
        {
            isin=1;
            if(c=='.')                 //遇到小数点
            {
                flag=-1;
            }
            else
           {
              if(flag==1)     //表示当前输入数字为小数点左面的数(整数位)
              {
                  temp=temp*10+c-'0';
              }
              else        //表示当前输入数字为小数点右面的数(小数位)
              {
                  temp=temp+(c-'0')/time;
                  time=time*10;
              }
          }

          c=getchar();
       }

       if(isin==1)             //判断前面是否有数字输入
       {
           num[nt++]=temp;
       }

       switch(compare(oper[ot-1],c))   //比较运算符优先级
      {
        case'<':                                       //前一运算符小于后面的优先级,把当前输入运算符压入栈中,继续读下一个字符
        {
            oper[ot++]=c;
            c=getchar();
            break;
        }
        case'=':
        {                    //遇到相匹配的括号或者'=',消去(即弹栈并放弃当前输入),并且读入下一个字符
            --ot;
            c=getchar();
            break;
        }
        case'>':                                //前一个运算符优先级大于当前输入运算符,用前一个栈中运算符进行计算
        {
            num[nt-2]=cal(num[nt-2],num[nt-1],oper[ot-1]);
            --nt;
            --ot;
            break;
        }
     }
   }
   return num[nt-1];      //处理完成,返回数字栈里面的最后值即为运算结果
}

int main()
{
    printf("Input Expression:\n");
    printf("%f",Value());
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值