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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 5_7.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. /* ---------------------------------------- */
  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 '-':
  70.       case '*':
  71.       case '/': return 1;         /* 是运算子            */
  72.       default:  return 0;         /* 不是运算子          */
  73.    }
  74. }
  75. /* ---------------------------------------- */
  76. /*  运算子的优先权                          */
  77. /* ---------------------------------------- */
  78. int priority(char op)
  79. {
  80.    switch ( op )
  81.    {
  82.       case '*':
  83.       case '/': return 3;
  84.       case '+':
  85.       case '-': return 2;
  86.       case '(': return 1;
  87.       default:  return 0;
  88.    }
  89. }
  90. /* ---------------------------------------- */
  91. /*  主程式: 输入中序表达式后, 转成后序.     */
  92. /* ---------------------------------------- */
  93. void main()
  94. {
  95.    char infix[100];               /* 中序表达式字符串      */
  96.    char result[100];              /* 结果表达式字符串      */
  97.    int op = 0;                    /* 运算子变数          */
  98.    int pos = 0;                   /* 目前表达式位置      */
  99.    int rpos = 0;                  /* 结果表达式位置      */
  100.    printf("请输入中序表达式 ==> ");
  101.    gets(infix);                   /* 读取表达式          */
  102.    while ( infix[pos] != '' && infix[pos] != 'n' )
  103.    {
  104.       if ( isoperator(infix[pos]) ) /* 是不是运算子      */
  105.       {
  106.          if ( empty(operator) || infix[pos] == '(' )
  107.             /* 存入运算子至栈 */
  108.             operator = push(operator,infix[pos]);
  109.          else
  110.          {
  111.             if ( infix[pos] == ')' ) /* 处理括号         */
  112.             {
  113.                while ( operator->data != '(' )
  114.                {
  115.                   /* 取出运算子直到是'(' */
  116.                   operator = pop(operator,&op);
  117.                   result[rpos++] = op; /* 存入结果表达式 */
  118.                }
  119.                /* 取出运算子'(' */
  120.                operator = pop(operator,&op);
  121.             }
  122.             else
  123.             {
  124.                /* 比较优先权 */
  125.                while ( priority(infix[pos]) <=
  126.                        priority(operator->data) &&
  127.                        !empty(operator) )
  128.                {
  129.                   /* 取出运算子 */
  130.                   operator = pop(operator,&op);
  131.                   result[rpos++] = op; /* 存入结果表达式 */
  132.                }
  133.                /* 存入运算子至栈 */
  134.                operator = push(operator,infix[pos]);
  135.             }
  136.          }
  137.       }
  138.       else
  139.          result[rpos++] = infix[pos];  /* 存入结果表达式 */
  140.       pos++;
  141.    }
  142.    while ( !empty(operator) )        /* 取出剩下的运算子 */
  143.    {
  144.       operator = pop(operator,&op);    /* 取出运算子     */
  145.       result[rpos++] = op;             /* 存入结果表达式 */
  146.    }
  147.    result[rpos] = '';                /* 设定字符串结束   */
  148.    printf("后序表达式是 %sn",result);
  149. }