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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 5_5.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 prefix  = 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 get_value(int op,int operand1,int operand2)
  78. {
  79.    switch ( (char) op )
  80.    {
  81.       case '*': return ( operand2 * operand1 );
  82.       case '/': return ( operand2 / operand1 );
  83.       case '+': return ( operand2 + operand1 );
  84.       case '-': return ( operand2 - operand1 );
  85.    }
  86. }
  87. /* ---------------------------------------- */
  88. /*  主程式: 输入前序表达式后, 计算其值.     */
  89. /* ---------------------------------------- */
  90. void main()
  91. {
  92.    char exp[100];                 /* 表达式字符串变数     */
  93.    int operand1 = 0;              /* 前运算元变数       */
  94.    int operand2 =0;               /* 后运算元变数       */
  95.    int result = 0;                /* 计算结果变数       */
  96.    int pos = 0;                   /* 目前表达式位置     */
  97.    int token = 0;                 /* 运算子或运算元     */
  98.    printf("请输入前序表达式 ==> ");
  99.    gets(exp);                     /* 读取表达式         */
  100.    printf("前序表达式[%s]的结果是 ",exp);
  101.    /* 将表达式存入栈 */
  102.    while ( exp[pos] != '' && exp[pos] != 'n' )
  103.    {
  104.       prefix = push(prefix,exp[pos]);
  105.       pos++;                      /* 下一字符串位置       */
  106.    }
  107.    /* 剖析表达式字符串回路 */
  108.    while ( !empty(prefix) )
  109.    {
  110.       prefix = pop(prefix,&token); /* 取出一元素        */
  111.       if ( isoperator(token) )    /* 是不是运算子       */
  112.       {
  113.          /* 从栈取出两运算元 */
  114.          operand = pop(operand,&operand1);
  115.          operand = pop(operand,&operand2);
  116.          /* 计算取出运算子和元的值后, 存入栈 */
  117.          operand = push(operand,
  118.                         get_value(token,operand2,operand1));
  119.       }
  120.       else
  121.          /* 是运算元, 存入运算元栈 */
  122.          operand = push(operand,token-48);
  123.    }
  124.    operand = pop(operand,&result); /* 取出结果          */
  125.    printf(" %dn",result);        /* 印出结果           */
  126. }