QQ登录

只需一步,快速开始

搜索
查看: 102|回复: 1

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

[复制链接]
最佳答案
0 
累计签到:3 天
连续签到:1 天
发表于 2017-10-6 22:51:25 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

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

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

  6. #define sizestack 50

  7. typedef double elemtype;
  8. typedef char elemtype_1;
  9. typedef char status;
  10. typedef struct stacklink{//存数字栈
  11.      elemtype * base;
  12.      elemtype * top;
  13.      int stacksize;
  14. }link;

  15. typedef struct stacklink_1{//存运算符栈
  16.      elemtype_1 * base;
  17.      elemtype_1 * top;
  18.      int stacksize;
  19. }clink;

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

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

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

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

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

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

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

  51. }

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

  54. return *s.top;
  55. }

  56. char precede(char q,char p){//判断运算的优先级,q 是栈顶元素, p是入栈的运算符
  57.        char z;
  58.        if(q=='#')
  59.        switch(p){
  60.        case'#':z='=';break;
  61.        case')':break;
  62.        default:z='<';break;
  63.        }
  64.        if(q=='+'||q=='-')
  65.        switch(p){
  66.        case'+':z='>';break;
  67.        case'-':z='>';break;
  68.        case'*':z='<';break;
  69.        case'/':z='<';break;
  70.        case'(':z='<';break;
  71.        case')':z='>';break;
  72.        case'#':z='>';break;
  73.        }
  74.        if(q=='*'||q=='/')
  75.        switch(p){
  76.        case'+':z='>';break;
  77.        case'-':z='>';break;
  78.        case'*':z='>';break;
  79.        case'/':z='>';break;
  80.        case'(':z='<';break;
  81.        case')':z='>';break;
  82.        case'#':z='>';break;
  83.        }
  84.       if(q=='(')
  85.       switch(p){
  86.          case')':z='>';break;
  87.          case'#':exit(0);break;
  88.          default:z='<';break;
  89.          }
  90.       if(q==')')
  91.       switch(p){
  92.       case'(':exit(0);break;
  93.       default:z='>';break;
  94.       }
  95.       return z;
  96. }

  97. double operate(double a,char theta, double b){
  98.     if(theta=='-')return b-a;
  99.     if(theta=='*')return b*a;
  100.     if(theta=='/')return b/a;
  101.     if(theta=='+')return b+a;


  102. }

  103. double  operatype(){
  104.     double a,b,d;
  105.     clink optr;   //字符栈
  106.      link opnd;  //数字栈
  107.     initstack_1(optr);//初始化
  108.     push_1(optr,'#');

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

  115.            while(isdigit(c)||c=='.'){//将输入的数有字符型转为双精度型
  116.                 str[i]=c;
  117.                 ++i;
  118.                 str[i]='\0';
  119.                 if(i>=10)return -1;
  120.                 scanf("%c",&c);
  121.                 if(c==' '){
  122.                     d=atof(str);
  123.                     push(opnd,d);
  124.                     i=0;
  125.                     break;
  126.                 }

  127.             }
  128.             

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

  131.     switch(precede(gettop_1(optr),c)){    //判断输入运算符和运算符栈顶的元素 优先级
  132.           case'<':
  133. cout<<'<';
  134.             push_1(optr,c);
  135.             break;
  136.             
  137.           case'=':
  138.               
  139. cout<<'=';
  140.             pop_1(optr,x);
  141.             break;
  142.             
  143.           case'>':
  144. cout<<'>';
  145.             pop_1(optr,theta);
  146.             pop(opnd,a);
  147.             pop(opnd,b);
  148.             push(opnd,operate(a,theta,b));
  149.             break;
  150.           }

  151. }

  152.         }
  153. return gettop(opnd);
  154. }


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


  157. return 0;
  158. }
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:3 天
连续签到:1 天
 楼主| 发表于 2017-10-7 16:19:16 | 显示全部楼层
这是重新又打的代码,问题已经解决了,有兴趣可以来看看,这个程序的 cin 和 scanf 很关键,不能随便改,本人也不是清楚他们的区别。另外检测输入的函数,还没有打出来,可以来提点意见。
  1. #include"iostream"
  2. #include"stdio.h"
  3. #include"stdlib.h"
  4. #include"ctype.h"
  5. using namespace std;

  6. #define sizestack 50

  7. typedef double elemtype;
  8. typedef char elemtype_1;
  9. typedef char status;
  10. typedef struct stacklink{
  11.      elemtype * base;
  12.      elemtype * top;
  13.      int stacksize;
  14. }link;

  15. typedef struct stacklink_1{
  16.      elemtype_1 * base;
  17.      elemtype_1 * top;
  18.      int stacksize;
  19. }clink;

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

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

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

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

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

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

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

  51. }

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

  54. return *s.top;
  55. }

  56. char precede(char q,char p){
  57.        char z;
  58.        if(q=='#')
  59.        switch(p){
  60.        case'#':z='=';break;
  61.        case')':break;
  62.        default:z='<';break;
  63.        }
  64.        if(q=='+'||q=='-')
  65.        switch(p){
  66.        case'+':z='>';break;
  67.        case'-':z='>';break;
  68.        case'*':z='<';break;
  69.        case'/':z='<';break;
  70.        case'(':z='<';break;
  71.        case')':z='>';break;
  72.        case'#':z='>';break;
  73.        }
  74.        if(q=='*'||q=='/')
  75.        switch(p){
  76.        case'+':z='>';break;
  77.        case'-':z='>';break;
  78.        case'*':z='>';break;
  79.        case'/':z='>';break;
  80.        case'(':z='<';break;
  81.        case')':z='>';break;
  82.        case'#':z='>';break;
  83.        }
  84.       if(q=='(')
  85.       switch(p){
  86.          case')':z='=';break;
  87.          case'#':exit(0);break;
  88.          default:z='<';break;
  89.          }
  90.       if(q==')')
  91.       switch(p){
  92.       case'(':exit(0);break;
  93.       default:z='>';break;
  94.       }
  95.       return z;
  96. }

  97. double operate(double a,char theta, double b){
  98.     if(theta=='-')return b-a;
  99.     if(theta=='*')return b*a;
  100.     if(theta=='/')return b/a;
  101.     if(theta=='+')return b+a;


  102. }

  103. int in(char c){
  104.    switch(c){
  105.    case'/':return 1;break;
  106.    case'+':return 1;break;
  107.    case'-':return 1;break;
  108.    case'*':return 1;break;
  109.    default :return 0;break;

  110.    }


  111. }


  112. double  operatype(){
  113. double a,b,d,n;
  114.     clink optr;        link opnd;
  115.     initstack_1(optr);
  116.     push_1(optr,'#');

  117.                        initstack(opnd);
  118.     char c,theta,x,s;
  119.     char str[10];
  120.     int i=0;
  121.    cin>>c;

  122.     while(c!='#'||gettop_1(optr)!='#'){
  123.            if(isdigit(c)||c=='.'){
  124.                  str[i]=c;
  125.                 ++i;
  126.                 str[i]='\0';
  127.                 if(i>=10)return -1;
  128.                scanf("%c",&c);
  129.                 if(c==' '){
  130.                     d=atof(str);
  131.                     push(opnd,d);
  132.                     i=0;
  133.                    scanf("%c",&c);
  134.                 }
  135.             }
  136.               /* if(!in(c)){
  137.                 scanf("%lf",&n);
  138.                 push(opnd,n);
  139.                 scanf("%c",&c);
  140.                  cout<<c;
  141.             }*/
  142.             else{
  143.           if(precede(gettop_1(optr),c)=='<'){
  144.              cout<<'<';
  145.             push_1(optr,c);
  146.          cin>>c;

  147.           }else
  148.           if(precede(gettop_1(optr),c)=='='){
  149.               cout<<'=';
  150.               pop_1(optr,x);
  151.               cin>>c;
  152.           }
  153.           else
  154.           if(precede(gettop_1(optr),c)=='>'){
  155.             cout<<'>';
  156.             pop_1(optr,theta);
  157.             pop(opnd,a);
  158.             pop(opnd,b);
  159.             push(opnd,operate(a,theta,b));
  160.          }

  161.       }

  162.    }

  163.    return gettop(opnd);
  164. }

  165. int main(){

  166.     cout<<operatype();


  167. return 0;
  168. }
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-10-22 03:22 Powered by Discuz! X2.5 Theme by dreambred

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