下面是一个表达式求值的程序,而且可用,我现在想把它改成表达式中只有BOOL型的值,只有1和0,然后求表达式的值,当然其中的/-不用,其他保留。当我把堆栈改为bool型的,提示stack<bool,class std::deque<bool,class std::allocator<bool> > >' to 'class std::stack<float,class std::deque<float,class std::allocator<float> >
这种错误,该好何解决啊???
或都怎么改这个程序啊??谢谢!
#ifdef   HAVE_CONFIG_H   
  #include   <config.h>   
  #endif   
    
  #include   <iostream>   
  #include   <stack>   
  #include   <cctype>   
  using   namespace   std;   
    
  void   MPN(void);   
  void   Intro();   
    
  int   main(void)   
  {   
      cout   <<   "**************欢迎使用**************"   <<endl;   
      Intro();   
      MPN();   
      return   0;   
  }   
    
  bool   Prr(char,char);   
    
  void   Cal(stack<float>&,stack<char>&);   
    
  float   Dot(float,float);   
    
  void   MPN(void)   
  {   
      int   used,pr;   
      float   argt;   
      char   c;   
      stack<float>   num;   
      stack<char>   oper;   
      argt=0;pr=0;used=0;   
      while(cin>>c,   !cin.eof())   
      {   
          if   (isdigit(c))   
          {   
              used=1;   
              argt=argt*10+(c-'0');   
              continue;   
          }     //将输入的数字类字符转换成数字;   
        if   (c=='+'||c=='-'||c=='*'||c=='/'||c=='.')   
          {   
                  if(used)   
                  {   
                      num.push(argt);argt=0;   
                      used=0;   
                  }     //将转化好的数字压入数字栈;   
                  if   (oper.empty()||oper.top()=='(')   {oper.push(c);continue;}   
                        //向操作符栈里压入第一个操作符;解决括号问题;   
                  while(!Prr(c,oper.top()))   
                    {   
                        Cal(num,oper);   
                        if   (oper.empty()||oper.top()=='(')   break;   
                    }   //根据运算符号优先级,调整运算顺序,并处理优先运算部分;   
                  oper.push(c);   
                  continue;   
          }   
          if   (c=='(')   
          {   
                pr++;oper.push(c);continue;     //括号入栈,作为括号内运算的标志;   
          }   
          if   (c==')')   
          {   
                pr--;       //括号结束,整理括号内的运算结果;   
                if   (used)   {num.push(argt);argt=0;used=0;}   
                while(!oper.empty())   
                {   
                    if   (oper.top()=='(')   break;   
                    Cal(num,oper);   
                }   
                oper.pop();   
                continue;   
          }   
          if   (c=='=')         //遇到‘=’号,输出结果;   
                {   
                    if   (pr)   {cout<<"括号数目不匹配,请检查并重新输入!"<<endl;return;}   
                    if   (used)   num.push(argt);   
                    while(!oper.empty())   Cal(num,oper);   
                    cout<<"表达式的值为:   "<<num.top()<<endl;   
                    return;   
                }   
            else   {cout<<"表达式输入错误,请重新输入!"<<endl;return;}   
        }   
  }   
    
  bool   Prr(char   s,char   t)   
  {   
          if   ((s=='*'||s=='/')&&(t=='+'||t=='-'))   return   true;   
          if   (s=='.')   return   true;   
            return   false;   
  }   
    
  void   Cal(stack<float>&   num,stack<char>&   oper)   
  {   
          float   a,b,r;   
          b=num.top();num.pop();   
          a=num.top();num.pop();   
          switch(   oper.top()   )   
          {   
                case   ('+'):r=   a+b;break;   
                case   ('-'):r=   a-b;break;   
                case   ('*'):r=   a*b;break;   
                case   ('/'):r=   a/b;break;   
                case   ('.'):r=Dot(a,b);   
          };   
          num.push(r);   
          oper.pop();   
  }   
    
  float   Dot(float   m,   float   n)       //处理小数   
  {   
        while   (n>=1)   n/=10;   
        n+=m;   
        return   n;   
  }   
  void   Intro()                                             //功能简介   
  {   
      cout<<endl<<"####主要功能如下:"<<endl;   
      cout<<"支持‘+’、‘-’,‘*’、‘/’四则混合运算,包括多重括号,及浮点数运算"   
              <<endl;   
      cout<<"例如,3.14*((25-4)/6+(70+2)/9)+4="<<endl;   
      cout<<"请注意一定要输入‘=’号以示结束。"<<endl;   
      cout<<endl<<"Powered   by   Gideon   ,   Kdevelop   on   Redhat9"<<endl;   
      cout<<endl<<"请输入待求表达式:"<<endl;   
  }   

解决方案 »

  1.   

    简单的试了一下
    计算是没有问题的
    不知道楼主想拿他来计算什么
    不废话,代码如下
    #ifdef  HAVE_CONFIG_H  
    #include  <config.h>  
    #endif  
    #include  <iostream>  
    #include  <stack>  
    #include  <cctype>  
    using  namespace  std;  void  MPN(void);  
    void  Intro();  int  main(void)  
    {  
    cout  <<  "**************欢迎使用**************"  <<endl;  
    Intro();  
    MPN();  
    return  0;  
    }  bool  Prr(char,char);  void  Cal(stack <bool>&,stack <char>&);  float  Dot(float,float);  void  MPN(void)  
    {  
    int  used,pr;  
    float  argt;  
    char  c;  
    stack <bool>  num;  
    stack <char>  oper;  
    argt=0;pr=0;used=0;  
    while(cin>>c,  !cin.eof())  
    {  
    if  (isdigit(c))  
    {  
    used=1;  
    argt=argt*10+(c-'0');  
    continue;  
    }    //将输入的数字类字符转换成数字;  
    if  (c=='+'||c=='-'||c=='*'||c=='/'||c=='.')  
    {  
    if(used)  
    {  
    num.push(argt);argt=0;  
    used=0;  
    }    //将转化好的数字压入数字栈;  
    if  (oper.empty()||oper.top()=='(')  {oper.push(c);continue;}  
    //向操作符栈里压入第一个操作符;解决括号问题;  
    while(!Prr(c,oper.top()))  
    {  
    Cal(num,oper);  
    if  (oper.empty()||oper.top()=='(')  break;  
    }  //根据运算符号优先级,调整运算顺序,并处理优先运算部分;  
    oper.push(c);  
    continue;  
    }  
    if  (c=='(')  
    {  
    pr++;oper.push(c);continue;    //括号入栈,作为括号内运算的标志;  
    }  
    if  (c==')')  
    {  
    pr--;      //括号结束,整理括号内的运算结果;  
    if  (used)  {num.push(argt);argt=0;used=0;}  
    while(!oper.empty())  
    {  
    if  (oper.top()=='(')  break;  
    Cal(num,oper);  
    }  
    oper.pop();  
    continue;  
    }  
    if  (c=='=')        //遇到‘=’号,输出结果;  
    {  
    if  (pr)  {cout <<"括号数目不匹配,请检查并重新输入!" <<endl;return;}  
    if  (used)  num.push(argt);  
    while(!oper.empty())  Cal(num,oper);  
    cout <<"表达式的值为:  " <<num.top() <<endl;  
    return;  
    }  
    else  {cout <<"表达式输入错误,请重新输入!" <<endl;return;}  
    }  
    }  bool  Prr(char  s,char  t)  
    {  
    if  ((s=='*'||s=='/')&&(t=='+'||t=='-'))  return  true;  
    if  (s=='.')  return  true;  
    return  false;  
    }  void  Cal(stack <bool>&  num,stack <char>&  oper)  
    {  
    float  a,b,r;  
    b=num.top();num.pop();  
    a=num.top();num.pop();  
    switch(  oper.top()  )  
    {  
    case  ('+'):r=  a+b;break;  
    case  ('-'):r=  a-b;break;  
    case  ('*'):r=  a*b;break;  
    case  ('/'):r=  a/b;break;  
    case  ('.'):r=Dot(a,b);  
    };  
    num.push(r);  
    oper.pop();  
    }  float  Dot(float  m,  float  n)      //处理小数  
    {  
    while  (n>=1)  n/=10;  
    n+=m;  
    return  n;  
    }  void  Intro()                                            //功能简介  
    {  
    cout <<endl <<"####主要功能如下:" <<endl;  
    cout <<"支持‘+’、‘-’,‘*’、‘/’四则混合运算,包括多重括号,及浮点数运算"  
    <<endl;  
    cout <<"例如,3.14*((25-4)/6+(70+2)/9)+4=" <<endl;  
    cout <<"请注意一定要输入‘=’号以示结束。" <<endl;  
    cout <<endl <<"Powered  by  Gideon  ,  Kdevelop  on  Redhat9" <<endl;  
    cout <<endl <<"请输入待求表达式:" <<endl;  
    }  
      

  2.   

    void  Cal(stack <bool>&,stack <char>&);  
    void  Cal(stack <bool>&  num,stack <char>&  oper)  
    {
    }
    做了修改即可
      

  3.   

    我的想计算一个布尔表达式的值:如1+0+(1*1)*0等等,就是任给一个字母表达式如a*b*(c+d),其中的a,b是布尔变量,求结果。用上面的程序是不是有点麻烦?
      

  4.   

    我知道错误的原因了,是没把void  Cal(stack <float>&,stack <char>&);这句代码改过来,没看到,唉、、、
    有没有更好的程序啊?我刚学编程不久,请教一下大家
      

  5.   

    bool型的变量相关运算
    应该是
    | & || && ! ^ 等等
    算子不同的
    不过你可以参考上面程序的思路