5_4.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:5k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 5_4.c                     */
  3. /*    中序四则表达式的值                    */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct stack_node                 /* 栈的结构宣告     */
  7. {
  8.    int data;                      /* 栈资料           */
  9.    struct stack_node *next;       /* 指向下一节点       */
  10. };
  11. typedef struct stack_node stack_list;  /* 串列新型态    */
  12. typedef stack_list *link;         /* 串列指标新型态     */
  13. link operator = NULL;             /* 运算子栈指标     */
  14. link operand  = NULL;             /* 运算元栈指标     */
  15. /* ---------------------------------------- */
  16. /*  栈资料的存入                          */
  17. /* ---------------------------------------- */
  18. link push(link stack,int value)
  19. {
  20.    link new_node;                 /* 新节点指标         */
  21.    /* 配置节点记忆体 */
  22.    new_node = ( link ) malloc(sizeof(stack_list));
  23.    if ( !new_node )
  24.    {
  25.       printf("记忆体配置失败! n");
  26.       return NULL;                /* 存入失败           */
  27.    }
  28.    new_node->data = value;        /* 建立节点内容       */
  29.    new_node->next = stack;        /* 新节点指向原开始   */
  30.    stack = new_node;              /* 新节点成为栈开始 */
  31.    return stack;
  32. }
  33. /* ---------------------------------------- */
  34. /*  栈资料的取出                          */
  35. /* ---------------------------------------- */
  36. link pop(link stack,int *value)
  37. {
  38.    link top;                      /* 指向栈顶端       */
  39.    if ( stack != NULL )
  40.    {
  41.       top = stack;                /* 指向栈顶端       */
  42.       stack = stack->next;        /* 栈指标指向下节点 */
  43.       *value = top->data;         /* 取出资料           */
  44.       free(top);                  /* 释回节点记忆体     */
  45.       return stack;               /* 传回栈指标       */
  46.    }
  47.    else
  48.       *value = -1;
  49. }
  50. /* ---------------------------------------- */
  51. /*  检查栈是否是空的                      */
  52. /* ---------------------------------------- */
  53. int empty(link stack)
  54. {
  55.    if ( stack == NULL )           /* 是否是空           */
  56.       return 1;                   /* 空的               */
  57.    else
  58.       return 0;                   /* 不是空的           */
  59. }
  60. /* ---------------------------------------- */
  61. /*  是否是运算子                            */
  62. /* ---------------------------------------- */
  63. int isoperator(char op)
  64. {
  65.    switch ( op )
  66.    {
  67.       case '+':
  68.       case '-':
  69.       case '*':
  70.       case '/': return 1;         /* 是运算子           */
  71.       default:  return 0;         /* 不是运算子         */
  72.    }
  73. }
  74. /* ---------------------------------------- */
  75. /*  运算子的优先权                          */
  76. /* ---------------------------------------- */
  77. int priority(char op)
  78. {
  79.    switch ( op )
  80.    {
  81.       case '*':
  82.       case '/': return 2;
  83.       case '+':
  84.       case '-': return 1;
  85.       default:  return 0;
  86.    }
  87. }
  88. /* ---------------------------------------- */
  89. /*  计算二元表达式的值                      */
  90. /* ---------------------------------------- */
  91. int get_value(int op,int operand1,int operand2)
  92. {
  93.    switch ( (char) op )
  94.    {
  95.       case '*': return ( operand2 * operand1 );
  96.       case '/': return ( operand2 / operand1 );
  97.       case '+': return ( operand2 + operand1 );
  98.       case '-': return ( operand2 - operand1 );
  99.    }
  100. }
  101. /* ---------------------------------------- */
  102. /*  主程式: 输入中序表达式后, 计算其值.     */
  103. /* ---------------------------------------- */
  104. void main()
  105. {
  106.    char exp[100];                 /* 表达式字符串变数     */
  107.    int op = 0;                    /* 运算子变数         */
  108.    int operand1 = 0;              /* 前运算元变数       */
  109.    int operand2 =0;               /* 后运算元变数       */
  110.    int result = 0;                /* 计算结果变数       */
  111.    int pos = 0;                   /* 目前表达式位置     */
  112.    printf("请输入中序表达式 ==> ");
  113.    gets(exp);                     /* 读取表达式         */
  114.    /* 剖析表达式字符串回路 */
  115.    while ( exp[pos] != '' && exp[pos] != 'n' )
  116.    {
  117.       if ( isoperator(exp[pos]) ) /* 是不是运算子       */
  118.       {
  119.          if ( !empty(operator) )  /* 检查运算子栈     */
  120.             while ( priority(exp[pos]) <=  /* 比较优先权回路 */
  121.                     priority(operator->data) &&
  122.                     !empty(operator) )
  123.             {
  124.                /* 从栈取出一运算子和两运算元 */
  125.                operator = pop(operator,&op);
  126.                operand = pop(operand,&operand1);
  127.                operand = pop(operand,&operand2);
  128.                /* 计算取出运算子和元的值后, 存入栈 */
  129.                operand = push(operand,
  130.                          get_value(op,operand1,operand2));
  131.             }
  132.          /* 是运算子, 存入运算子栈 */
  133.          operator = push(operator,exp[pos]);
  134.       }
  135.       else
  136.          /* 是运算元, 存入运算元栈 */
  137.          operand = push(operand,exp[pos]-48);
  138.       pos++;                      /* 下一字符串位置       */
  139.    }
  140.    /* 取出运算子栈的全部内容 */
  141.    while ( !empty(operator) )
  142.    {
  143.       /* 从栈取出一运算子和两运算元 */
  144.       operator = pop(operator,&op);
  145.       operand = pop(operand,&operand1);
  146.       operand = pop(operand,&operand2);
  147.       /* 计算取出运算子和元的值后, 存入栈 */
  148.       operand = push(operand,get_value(op,operand1,operand2));
  149.    }
  150.    operand = pop(operand,&result);     /* 取出结果      */
  151.    printf("表达式[%s]的结果是 %dn",exp,result);
  152. }