三木社区

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

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

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:24:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo3-7.c 表达式求值(范围为int类型,输入负数要用(0-正数)表示) */
  2. typedef int SElemType; /* 栈元素类型为整型,改进算法3.4 */
  3. #include"c1.h"
  4. #include"c3-1.h"
  5. #include"bo3-1.c"

  6. SElemType Precede(SElemType t1,SElemType t2) /* 同algo3-6.c */
  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("ERROR2\n");
  45.                          exit(ERROR);
  46.                 default: f='>';
  47.               }
  48.    }
  49.    return f;
  50. }

  51. Status In(SElemType c) /* 几乎与algo3-6.c相同 */
  52. { /* 判断c是否为运算符 */
  53.    switch(c)
  54.    {
  55.      case'+':
  56.      case'-':
  57.      case'*':
  58.      case'/':
  59.      case'(':
  60.      case')':
  61.      case'=':return TRUE; /* 此句不同于algo3-6.c */
  62.      default:return FALSE;
  63.    }
  64. }

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

  80. SElemType EvaluateExpression() /* 有改动 */
  81. { /* 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈 */
  82.    SqStack OPTR,OPND;
  83.    SElemType a,b,d,x,theta;
  84.    char c; /* 存放由键盘接收的字符串 */
  85.    char z[6]; /* 存放整数字符串 */
  86.    int i;
  87.    InitStack(&OPTR); /* 初始化运算符栈 */
  88.    Push(&OPTR,'='); /* =是表达式结束标志 */
  89.    InitStack(&OPND); /* 初始化运算数栈 */
  90.    c=getchar();
  91.    GetTop(OPTR,&x);
  92.    while(c!='='||x!='=')
  93.    {
  94.      if(In(c)) /* 是7种运算符之一 */
  95.        switch(Precede(x,c))
  96.        {
  97.          case'<':Push(&OPTR,c); /* 栈顶元素优先权低 */
  98.                  c=getchar();
  99.                  break;
  100.          case'=':Pop(&OPTR,&x); /* 脱括号并接收下一字符 */
  101.                  c=getchar();
  102.                  break;
  103.          case'>':Pop(&OPTR,&theta); /* 退栈并将运算结果入栈 */
  104.                  Pop(&OPND,&b);
  105.                  Pop(&OPND,&a);
  106.                  Push(&OPND,Operate(a,theta,b));
  107.        }
  108.      else if(c>='0'&&c<='9') /* c是操作数 */
  109.      {
  110.        i=0;
  111.        do
  112.        {
  113.          z[i]=c;
  114.          i++;
  115.          c=getchar();
  116.        }while(c>='0'&&c<='9');
  117.        z[i]=0;
  118.        d=atoi(z); /* 将字符串数组转为整型存于d */
  119.        Push(&OPND,d);
  120.      }
  121.      else /* c是非法字符 */
  122.      {
  123.        printf("ERROR3\n");
  124.        exit(ERROR);
  125.      }
  126.      GetTop(OPTR,&x);
  127.    }
  128.    GetTop(OPND,&x);
  129.    return x;
  130. }

  131. void main() /* 有改动 */
  132. {
  133.    printf("请输入算术表达式,负数要用(0-正数)表示,并以=结束\n");
  134.    printf("%d\n",EvaluateExpression());
  135. }
  136. 
复制代码


回复

使用道具 举报

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

辽公网安备 21021702000620号

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

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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