鱼C论坛

 找回密码
 立即注册
查看: 2803|回复: 1

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

[复制链接]
发表于 2017-10-6 22:51:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 努力学习只是 于 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;


}

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

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

           while(isdigit(c)||c=='.'){//将输入的数有字符型转为双精度型
                str[i]=c;
                ++i;
                str[i]='\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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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;

   }


}


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

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

    while(c!='#'||gettop_1(optr)!='#'){
           if(isdigit(c)||c=='.'){
                 str[i]=c;
                ++i;
                str[i]='\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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表