努力学习只是 发表于 2017-10-6 22:51:25

表达式求值,第一次做,不知道问题出在那

本帖最后由 努力学习只是 于 2017-10-9 21:01 编辑

表达式求值,设置了两个栈,一个存运算符,一个存数字;
输入153 * 12 + 1,结果输不出;代码较长,能不能帮我,看看问题所在,谢谢了
#include"iostream"
#include"stdio.h"
#include"stdlib.h"
#include"ctype.h"
using namespace std;

#define sizestack 50

typedef double elemtype;
typedef char elemtype_1;
typedef char status;
typedef struct stacklink{//存数字栈
   elemtype * base;
   elemtype * top;
   int stacksize;
}link;

typedef struct stacklink_1{//存运算符栈
   elemtype_1 * base;
   elemtype_1 * top;
   int stacksize;
}clink;

void initstack(link &s){
   s.base=(elemtype*)malloc(sizestack*sizeof(elemtype));
   s.top=s.base;
   s.stacksize=sizestack;
}

void initstack_1(clink &s){
   s.base=(elemtype_1*)malloc(sizestack*sizeof(elemtype_1));
   s.top=s.base;
   s.stacksize=sizestack;
}

void push(link &s,double c){//压入数字
   *s.top=c;
   ++s.top;
}

void push_1(clink &s,char c){//压入运算符
   *s.top=c;
   ++s.top;
}

int pop(link& s,double &e){
    --s.top;
    e=*s.top;
    return 1;
}

int pop_1(clink& s,char &e){//弹出运算符
    --s.top;
    e=*s.top;
    return 1;
}

double gettop(link s){
   --s.top;
return *s.top;

}

char gettop_1(clink s){//取栈顶元素
   --s.top;

return *s.top;
}

char precede(char q,char p){//判断运算的优先级,q 是栈顶元素, p是入栈的运算符
       char z;
       if(q=='#')
       switch(p){
       case'#':z='=';break;
       case')':break;
       default:z='<';break;
       }
       if(q=='+'||q=='-')
       switch(p){
       case'+':z='>';break;
       case'-':z='>';break;
       case'*':z='<';break;
       case'/':z='<';break;
       case'(':z='<';break;
       case')':z='>';break;
       case'#':z='>';break;
       }
       if(q=='*'||q=='/')
       switch(p){
       case'+':z='>';break;
       case'-':z='>';break;
       case'*':z='>';break;
       case'/':z='>';break;
       case'(':z='<';break;
       case')':z='>';break;
       case'#':z='>';break;
       }
      if(q=='(')
      switch(p){
         case')':z='>';break;
         case'#':exit(0);break;
         default:z='<';break;
         }
      if(q==')')
      switch(p){
      case'(':exit(0);break;
      default:z='>';break;
      }
      return z;
}

double operate(double a,char theta, double b){
    if(theta=='-')return b-a;
    if(theta=='*')return b*a;
    if(theta=='/')return b/a;
    if(theta=='+')return b+a;


}

doubleoperatype(){
    double a,b,d;
    clink optr;   //字符栈
   link opnd;//数字栈
    initstack_1(optr);//初始化
    push_1(optr,'#');

                     initstack(opnd);//初始化
    char c,theta,x,s;
    char str;
    int i=0;
    scanf("%c",&c);
    while(c!='#'||gettop_1(optr)!='#'){

         while(isdigit(c)||c=='.'){//将输入的数有字符型转为双精度型
                str=c;
                ++i;
                str='\0';
                if(i>=10)return -1;
                scanf("%c",&c);
                if(c==' '){
                  d=atof(str);
                  push(opnd,d);
                  i=0;
                  break;
                }

            }
            

scanf("%c",&c);
if(c=='*'||c=='/'||c=='-'||c=='+'||c=='#'){

    switch(precede(gettop_1(optr),c)){    //判断输入运算符和运算符栈顶的元素 优先级
          case'<':
cout<<'<';
            push_1(optr,c);
            break;
            
          case'=':
            
cout<<'=';
            pop_1(optr,x);
            break;
            
          case'>':
cout<<'>';
            pop_1(optr,theta);
            pop(opnd,a);
            pop(opnd,b);
            push(opnd,operate(a,theta,b));
            break;
          }

}

      }
return gettop(opnd);
}


int main(){
    cout<<operatype();//输出计算的结果


return 0;
}

努力学习只是 发表于 2017-10-7 16:19:16

这是重新又打的代码,问题已经解决了,有兴趣可以来看看,这个程序的 cin 和 scanf 很关键,不能随便改,本人也不是清楚他们的区别。另外检测输入的函数,还没有打出来,可以来提点意见。
#include"iostream"
#include"stdio.h"
#include"stdlib.h"
#include"ctype.h"
using namespace std;

#define sizestack 50

typedef double elemtype;
typedef char elemtype_1;
typedef char status;
typedef struct stacklink{
   elemtype * base;
   elemtype * top;
   int stacksize;
}link;

typedef struct stacklink_1{
   elemtype_1 * base;
   elemtype_1 * top;
   int stacksize;
}clink;

void initstack(link &s){
   s.base=(elemtype*)malloc(sizestack*sizeof(elemtype));
   s.top=s.base;
   s.stacksize=sizestack;
}

void initstack_1(clink &s){
   s.base=(elemtype_1*)malloc(sizestack*sizeof(elemtype_1));
   s.top=s.base;
   s.stacksize=sizestack;
}

void push(link &s,double c){
   *s.top=c;
   ++s.top;
}

void push_1(clink &s,char c){
   *s.top=c;
   ++s.top;
}

int pop(link& s,double &e){
    --s.top;
    e=*s.top;
    return 1;
}

int pop_1(clink& s,char &e){
    --s.top;
    e=*s.top;
    return 1;
}

double gettop(link s){
   --s.top;
return *s.top;

}

char gettop_1(clink s){
   --s.top;

return *s.top;
}

char precede(char q,char p){
       char z;
       if(q=='#')
       switch(p){
       case'#':z='=';break;
       case')':break;
       default:z='<';break;
       }
       if(q=='+'||q=='-')
       switch(p){
       case'+':z='>';break;
       case'-':z='>';break;
       case'*':z='<';break;
       case'/':z='<';break;
       case'(':z='<';break;
       case')':z='>';break;
       case'#':z='>';break;
       }
       if(q=='*'||q=='/')
       switch(p){
       case'+':z='>';break;
       case'-':z='>';break;
       case'*':z='>';break;
       case'/':z='>';break;
       case'(':z='<';break;
       case')':z='>';break;
       case'#':z='>';break;
       }
      if(q=='(')
      switch(p){
         case')':z='=';break;
         case'#':exit(0);break;
         default:z='<';break;
         }
      if(q==')')
      switch(p){
      case'(':exit(0);break;
      default:z='>';break;
      }
      return z;
}

double operate(double a,char theta, double b){
    if(theta=='-')return b-a;
    if(theta=='*')return b*a;
    if(theta=='/')return b/a;
    if(theta=='+')return b+a;


}

int in(char c){
   switch(c){
   case'/':return 1;break;
   case'+':return 1;break;
   case'-':return 1;break;
   case'*':return 1;break;
   default :return 0;break;

   }


}


doubleoperatype(){
double a,b,d,n;
    clink optr;      link opnd;
    initstack_1(optr);
    push_1(optr,'#');

                     initstack(opnd);
    char c,theta,x,s;
    char str;
    int i=0;
   cin>>c;

    while(c!='#'||gettop_1(optr)!='#'){
         if(isdigit(c)||c=='.'){
               str=c;
                ++i;
                str='\0';
                if(i>=10)return -1;
               scanf("%c",&c);
                if(c==' '){
                  d=atof(str);
                  push(opnd,d);
                  i=0;
                   scanf("%c",&c);
                }
            }
            /* if(!in(c)){
                scanf("%lf",&n);
                push(opnd,n);
                scanf("%c",&c);
               cout<<c;
            }*/
            else{
          if(precede(gettop_1(optr),c)=='<'){
             cout<<'<';
            push_1(optr,c);
         cin>>c;

          }else
          if(precede(gettop_1(optr),c)=='='){
            cout<<'=';
            pop_1(optr,x);
            cin>>c;
          }
          else
          if(precede(gettop_1(optr),c)=='>'){
            cout<<'>';
            pop_1(optr,theta);
            pop(opnd,a);
            pop(opnd,b);
            push(opnd,operate(a,theta,b));
         }

      }

   }

   return gettop(opnd);
}

int main(){

    cout<<operatype();


return 0;
}
页: [1]
查看完整版本: 表达式求值,第一次做,不知道问题出在那