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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例:5_6.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 operand  = NULL;             /* 运算元栈指标     */
  14. /* ---------------------------------------- */
  15. /*  栈资料的存入                          */
  16. /* ---------------------------------------- */
  17. link push(link stack,int value)
  18. {
  19.    link new_node;                 /* 新节点指标         */
  20.    /* 配置节点记忆体 */
  21.    new_node = ( link ) malloc(sizeof(stack_list));
  22.    if ( !new_node )
  23.    {
  24.       printf("记忆体配置失败! n");
  25.       return NULL;                /* 存入失败           */
  26.    }
  27.    new_node->data = value;        /* 建立节点内容       */
  28.    new_node->next = stack;        /* 新节点指向原开始   */
  29.    stack = new_node;              /* 新节点成为栈开始 */
  30.    return stack;
  31. }
  32. /* ---------------------------------------- */
  33. /*  栈资料的取出                          */
  34. /* ---------------------------------------- */
  35. link pop(link stack,int *value)
  36. {
  37.    link top;                      /* 指向栈顶端       */
  38.    if ( stack != NULL )
  39.    {
  40.       top = stack;                /* 指向栈顶端       */
  41.       stack = stack->next;        /* 栈指标指向下节点 */
  42.       *value = top->data;         /* 取出资料           */
  43.       free(top);                  /* 释回节点记忆体     */
  44.       return stack;               /* 传回栈指标       */
  45.    }
  46.    else
  47.       *value = -1;
  48. }
  49. /* ---------------------------------------- */
  50. /*  检查栈是否是空的                      */
  51. /* ---------------------------------------- */
  52. int empty(link stack)
  53. {
  54.    if ( stack == NULL )           /* 是否是空           */
  55.       return 1;                   /* 空的               */
  56.    else
  57.       return 0;                   /* 不是空的           */
  58. }
  59. /* ---------------------------------------- */
  60. /*  是否是运算子                            */
  61. /* ---------------------------------------- */
  62. int isoperator(char op)
  63. {
  64.    switch ( op )
  65.    {
  66.       case '+':
  67.       case '-':
  68.       case '*':
  69.       case '/': return 1;         /* 是运算子           */
  70.       default:  return 0;         /* 不是运算子         */
  71.    }
  72. }
  73. /* ---------------------------------------- */
  74. /*  计算二元表达式的值                      */
  75. /* ---------------------------------------- */
  76. int get_value(int op,int operand1,int operand2)
  77. {
  78.    switch ( (char) op )
  79.    {
  80.       case '*': return ( operand2 * operand1 );
  81.       case '/': return ( operand2 / operand1 );
  82.       case '+': return ( operand2 + operand1 );
  83.       case '-': return ( operand2 - operand1 );
  84.    }
  85. }
  86. /* ---------------------------------------- */
  87. /*  主程式: 输入后序表达式后, 计算其值.     */
  88. /* ---------------------------------------- */
  89. void main()
  90. {
  91.    char exp[100];                 /* 表达式字符串变数     */
  92.    int operand1 = 0;              /* 前运算元变数       */
  93.    int operand2 = 0;              /* 后运算元变数       */
  94.    int result = 0;                /* 计算结果变数       */
  95.    int pos = 0;                   /* 目前表达式位置     */
  96.    printf("请输入后序表达式 ==> ");
  97.    gets(exp);                     /* 读取表达式         */
  98.    printf("后序表达式[%s]的结果是 ",exp);
  99.    /* 剖析表达式字符串回路 */
  100.    while ( exp[pos] != '' && exp[pos] != 'n' )
  101.    {
  102.       if ( isoperator(exp[pos]) ) /* 是不是运算子       */
  103.       {
  104.          /* 从栈取出一运算子和两运算元 */
  105.          operand = pop(operand,&operand1);
  106.          operand = pop(operand,&operand2);
  107.          /* 计算取出运算子和元的值后, 存入栈 */
  108.          operand = push(operand,
  109.                         get_value(exp[pos],operand1,operand2));
  110.       }
  111.       else
  112.          /* 是运算元, 存入运算元栈 */
  113.          operand = push(operand,exp[pos]-48);
  114.       pos++;                      /* 下一字符串位置       */
  115.    }
  116.    operand = pop(operand,&result); /* 取出结果          */
  117.    printf(" %dn",result);        /* 印出结果           */
  118. }