码迷,mamicode.com
首页 > 其他好文 > 详细

7.5 中序式转后序式

时间:2016-07-19 20:41:21      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

7-6 toPosfix.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 int PRI(char op) //设定算符的优先级
  4 {
  5    switch (op)
  6    {
  7    case +:
  8    case -:
  9       return 1;
 10    case *:
 11    case /:
 12       return 2;
 13    default:
 14       return 0;
 15    }
 16 }
 17 char *toPosfix(char *infix)        // 求后序表达式
 18 {
 19    int length=strlen(infix);
 20    char *stack,*buf,*p,flag;
 21    char op;
 22    int i,top=0;
 23    if(!(stack=(char *)malloc(sizeof(char)*length))) //作为栈内存空间
 24    {
 25        printf("内存分配失败!\n");
 26        exit(0); 
 27    } 
 28    if(!(buf=(char *)malloc(sizeof(char)*length*2))) //保存后序表达式字符串 
 29    {
 30        printf("内存分配失败!\n");
 31        exit(0); 
 32    }
 33    p=buf;
 34    for(i=0;i<length;i++)
 35    {
 36       op=infix[i]; //获取表达式中一个字符 
 37       switch(op) //根据字符进行入栈操作 
 38       {
 39       case (: //为左括号 
 40          if(top<length) //若栈未满 
 41          {
 42             top++; //修改栈顶指针 
 43             stack[top]=op; //保存运算符到栈
 44          }
 45          flag=0;
 46          break;
 47       case +:
 48       case -:
 49       case *:
 50       case /:
 51          while(PRI(stack[top])>=PRI(op)) //判断栈顶运算符与当前运算符的级别 
 52          {
 53             *p++=stack[top]; //将栈中的运算符保存到字符串 
 54             top--; //修改栈顶指针 
 55             flag=0;
 56          }
 57          if(top<length) //栈未满 
 58          {
 59             top++; //修改栈顶指针 
 60             stack[top]=op; //保存运算符到栈 
 61             if(flag==1)
 62                 *p++=,; //添加一个逗号分隔数字 
 63             flag=0;
 64          }
 65          break;
 66       case ): //右括号 
 67          while(stack[top]!= () //在栈中一直找到左括号 
 68          {
 69             *p++=stack[top]; //将栈顶的运算符保存到字符串 
 70             top--; //修改栈顶指针 
 71          }
 72          flag=0;
 73          top--; //再将修改栈顶指针,将左括号出栈 
 74          break;
 75       default: //其他字符(数字、字母等非运算符)
 76          *p++=op;
 77          flag=1;
 78          break;
 79       }
 80    }
 81    while (top>0) //若栈不为空 
 82    {
 83       *p++=stack[top]; //将栈中的运算符出栈 
 84       top--; //修改栈顶指针 
 85    }
 86    free(stack);//释放栈占用的内存 
 87    *p=\0;
 88    return (buf); //返回字符串 
 89 }
 90 double calc(double d1, char op, double d2) //计算函数 
 91 {
 92    switch (op) //根据运算符进行操作 
 93    {
 94    case +:
 95       return d1 + d2;
 96    case -:
 97       return d1 - d2;
 98    case *:
 99       return d1 * d2;
100    case /:
101       return d1 / d2;
102    }
103    return 0;
104 }
105 double eval(char *postfix)        //计算表达式的值 
106 {
107    double *stack,num,k=1.0; //k为系数 
108    int i,length,top=0,dec=0,flag;//dec为0表示整数,为1表示小数,flag=1表示有数据需入栈 
109    char token;
110 
111    length=strlen(postfix);
112    if(!(stack=(double *)malloc(sizeof(double)*length)))
113    {
114        printf("内存分配失败!\n");
115        exit(0); 
116    }
117    num=0;
118    for(i=0;i<length;i++)
119    {
120       token=postfix[i]; //取出一个字符 
121       switch(token)
122       {
123       case +: //若是运算符 
124       case -:
125       case *:
126       case /:
127          if(top<length && flag==1) //若栈未满 
128          {
129              top++; //修改栈顶指针 
130             stack[top]=(double)num; //将数字保存到栈中
131             num=0;
132          }         
133          stack[top-1]=calc(stack[top-1], token, stack[top]);//取出栈栈前两个元素进行运算,结果保存到栈中 
134          top--; //修改栈顶指针 
135          dec=0;//先设为整数    
136          flag=0;//下一步操作不将数入栈     
137          break;
138       default: //不为运算符 
139          if(token==,) //若为逗号
140          {
141              if(top<length) //若栈未满 
142              {
143                 top++; //修改栈顶指针 
144                 stack[top]=(double)num; //将数字保存到栈中
145                 num=0;
146                 dec=0;
147                 break; 
148              }
149          }
150             else if(token==.)
151             {
152             k=1.0;
153             dec=1;
154             break;
155          }
156          if(dec==1) //小数部分 
157          {
158             k=k*0.1;
159             num=num+(token-0)*k;
160          }
161          else
162          {
163              num=num*10+token-0;
164          }
165          flag=1;//有数需要入库 
166          break;
167       }
168    }
169    return stack[top]; //返回栈顶的结果 
170 }
171 int main()
172 {
173    char infix[80];
174    printf("输入表达式:");
175    scanf("%s",infix); 
176    printf("中序表达式:%s\n", infix);
177    printf("后序表达式:%s\n", toPosfix(infix));
178    printf("后序表达式求值:%lf\n",eval(toPosfix(infix)));
179    getch();
180    return 0;
181 }

 

7.5 中序式转后序式

标签:

原文地址:http://www.cnblogs.com/wozixiaoyao/p/5686016.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!