leehomjan 发表于 2013-1-26 12:35:16

四则运算算法

通过输入四则运算表达是如1+2*3+4/5转换为123*+45/并求值。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 100/*符号优先级*/int pri(char c){switch(c){case '*':case '/':return 3;case '+':case '-':return 2;case '(':case ')':return 4;case '=':return 1;default:return -1;}}/*通过输入的算术式得到该算术式对应的后缀表达式*/void change(char* src, char* output){int i = 0, optSiz = 0, symSTop = -1;      /*用于存放算术符号的栈*/char symS = {'\0'};      /*遍历算术表达式*/while(i < strlen(src)){/* 如果是数字,不需要压入到符号栈,直接写入到输出字符串*/if( src >= '0' && src <= '9'){while(src >= '0' && src <= '9'){output = src;}                        /*12+34 -> 1234+ 加上空格-> 12 34 +*/output = ' ';}                /*当遇上非右括号的符号,进行压栈和出栈*/if( ')' != src){/* + - * / and = ( */if( (SIZE > symSTop + 1)&& (-1 == symSTop || pri(src) > pri(symS)) ){/*栈未满并且 栈空或者待处理符号的优先级大于栈顶符号的优先级 入栈*/symS[++symSTop] = src;}else{while( -1 != symSTop && '(' != symS&& pri(src) <= pri(symS) ){       /* 栈不为空 栈顶符号不为'(' 并且 待处理符号的优先级小于栈顶符号时 出栈*/output = symS;output = ' ';symS = '\0';}/* 优先级不小于当前处理符号优先级的符号全部出栈后,将当前符号入栈*/symS[++symSTop] = src;}}                /*遇上右括号时,进行括号的处理*/if( ')' == src ){/* 出栈,直到遇到左括号*/while( -1 != symSTop ){       /*遇到左括号,进入下一轮处理*/if( '(' == symS ){++i;break;}                              /*非左括号,进行出栈处理*/output = symS;output = ' ';symS = '\0';}if( -1 == symSTop ) {printf("'(' is missed!\n");exit(0);}else symS = '\0';}}while( -1 != symSTop ){/*将剩余的符号进行出栈处理*/if('('== symS){printf("')' is missed!\n");exit(0);}output = symS;output = ' ';symS = '\0';}}int calculate(int m,int n, char com){switch(com){case '+':return m + n;case '-':return m - n;case '*':return m * n;case '/':return m / n;default:return -1;}}int cal(char* output){int i = 0, rslSTop = -1;int rslS = {0};while(i < strlen(output)){if(' ' == output || '=' == output){ ++i;continue;}else if('0' <= output && '9' >= output){                        /*获取数据*/int val = 0;while('0' <= output && '9' >= output){val = 10*val + (output-'0');/*in ASCII '0' is 48 in decimal*/}rslS[++rslSTop] = val;continue;}else if( 1 <= rslSTop ){       /*遇上符号时,将栈顶两数与该符号进行四则运算,将计算结果存于栈顶的下一个位置*/rslS = calculate(rslS, rslS, output);                        /*是计算得到的结果成为栈顶*/rslS = '\0';}else{printf("error\n");return -1;}}      /*获取最终的计算结果 即rslS*/return rslS;}int main(){char input = {'\0'};char output = {'\0'};int iptSiz = 0;char gc;while(iptSiz < SIZE-1){gc = getchar();if(' ' == gc) continue;if('\n' == gc) break;input = gc;//if('=' == gc) break;}change(input, output);printf("%s\n", output);printf("%d\n", cal(output));return 0;}
页: [1]
查看完整版本: 四则运算算法