标签:
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 }
标签:
原文地址:http://www.cnblogs.com/wozixiaoyao/p/5686016.html