三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 257|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo3-6.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:23:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo3-6.c 表达式求值(输入、输出和中间结果均只能是0~9) */
  2. typedef char SElemType;
  3. #include"c1.h"
  4. #include"c3-1.h"
  5. #include"bo3-1.c"

  6. SElemType Precede(SElemType t1,SElemType t2)
  7. { /* 根据教科书表3.1,判断两符号的优先关系 */
  8.    SElemType f;
  9.    switch(t2)
  10.    {
  11.      case '+':
  12.      case '-':if(t1=='('||t1=='#')
  13.                 f='<';
  14.               else
  15.                 f='>';
  16.               break;
  17.      case '*':
  18.      case '/':if(t1=='*'||t1=='/'||t1==')')
  19.                 f='>';
  20.               else
  21.                 f='<';
  22.               break;
  23.      case '(':if(t1==')')
  24.               {
  25.                 printf("ERROR1\n");
  26.                 exit(ERROR);
  27.               }
  28.               else
  29.                 f='<';
  30.               break;
  31.      case ')':switch(t1)
  32.               {
  33.                 case '(':f='=';
  34.                          break;
  35.                 case '#':printf("ERROR2\n");
  36.                          exit(ERROR);
  37.                 default: f='>';
  38.               }
  39.               break;
  40.      case '#':switch(t1)
  41.               {
  42.                 case '#':f='=';
  43.                          break;
  44.                 case '(':printf("ERROR3\n");
  45.                          exit(ERROR);
  46.                 default: f='>';
  47.               }
  48.    }
  49.    return f;
  50. }

  51. Status In(SElemType c)
  52. { /* 判断c是否为运算符 */
  53.    switch(c)
  54.    {
  55.      case'+':
  56.      case'-':
  57.      case'*':
  58.      case'/':
  59.      case'(':
  60.      case')':
  61.      case'#':return TRUE;
  62.      default:return FALSE;
  63.    }
  64. }

  65. SElemType Operate(SElemType a,SElemType theta,SElemType b)
  66. {
  67.    SElemType c;
  68.    a=a-48;
  69.    b=b-48;
  70.    switch(theta)
  71.    {
  72.      case'+':c=a+b+48;
  73.              break;
  74.      case'-':c=a-b+48;
  75.              break;
  76.      case'*':c=a*b+48;
  77.              break;
  78.      case'/':c=a/b+48;
  79.    }
  80.    return c;
  81. }

  82. SElemType EvaluateExpression() /* 算法3.4 */
  83. { /* 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈 */
  84.    SqStack OPTR,OPND;
  85.    SElemType a,b,c,x,theta;
  86.    InitStack(&OPTR);
  87.    Push(&OPTR,'#');
  88.    InitStack(&OPND);
  89.    c=getchar();
  90.    GetTop(OPTR,&x);
  91.    while(c!='#'||x!='#')
  92.    {
  93.      if(In(c)) /* 是7种运算符之一 */
  94.        switch(Precede(x,c))
  95.        {
  96.          case'<':Push(&OPTR,c); /* 栈顶元素优先权低 */
  97.                  c=getchar();
  98.                  break;
  99.          case'=':Pop(&OPTR,&x); /* 脱括号并接收下一字符 */
  100.                  c=getchar();
  101.                  break;
  102.          case'>':Pop(&OPTR,&theta); /* 退栈并将运算结果入栈 */
  103.                  Pop(&OPND,&b);
  104.                  Pop(&OPND,&a);
  105.                  Push(&OPND,Operate(a,theta,b));
  106.                  break;
  107.        }
  108.      else if(c>='0'&&c<='9') /* c是操作数 */
  109.      {
  110.        Push(&OPND,c);
  111.        c=getchar();
  112.      }
  113.      else /* c是非法字符 */
  114.      {
  115.        printf("ERROR4\n");
  116.        exit(ERROR);
  117.      }
  118.      GetTop(OPTR,&x);
  119.    }
  120.    GetTop(OPND,&x);
  121.    return x;
  122. }

  123. void main()
  124. {
  125.    printf("请输入算术表达式(中间值及最终结果要在0~9之间),并以#结束\n");
  126.    printf("%c\n",EvaluateExpression());
  127. }
  128. 
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-10-21 00:32 , Processed in 0.026418 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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