四则运算
2013-10-18 15:21
78 查看
#include <stdio.h> #include <memory> #include <string.h> /*****************************************/ //这个算法开辟了额外的空间。 //分析这个问题可以知道,字符串长度len是奇数(0不考虑) //数字的个数是len/2+1,符号的个数为len/2,然后将符号和数字存储起来 //第一步处理所有的乘除法,此时有一个特点就是如果几个数 //连续进行乘除法的时候就需要向前存储结果(为了方便后面的加减法运算) //算法复杂度O(n) /*****************************************/ int calculate(int len,char *expStr) { int i,j,k,answer; int* num=(int*)malloc((len/2+1)*sizeof(int)); char* exp=(char*)malloc(len/2); for (i=0,j=0,k=0;i<len;i++) //将符号和数字分开存储 { if(i%2==0) num[j++]=expStr[i]-'0'; else exp[k++]=expStr[i]; } //乘除法处理 for (i=0,j=1;i<len/2;i++) { if (exp[i]!='*'&&exp[i]!='/') { j=1; continue; } if (exp[i]=='*') { num[i+1]*=num[i]; for (k=0;k<j;k++) { num[i-k]=num[i+1]; } j++; } else if (exp[i]=='/') { num[i+1]=num[i]/num[i+1]; for (k=0;k<j;k++) { num[i-k]=num[i+1]; } j++; } } //处理加减法 answer=num[0]; for (i=0,j=1;i<len/2;i++) { if (exp[i]=='+') answer+=num[i+1]; else if (exp[i]=='-') answer-=num[i+1]; } return answer; } int main() { char* a="1+4*5-8/3*2*2*2"; int result=calculate(strlen(a),a); //int result=calculate2(strlen(a),a); printf("%d",result); return 0; } //网上的答案,用栈进行操作 int calculate2(int len,char *expStr) { struct { char opdata[200]; int top; }opstack; //定义操作符栈 opstack.top = -1; int i=0;//遍历字符串的下标 int t=0;//当前后缀表达式的长度 char ch = expStr[i]; while (ch!='\0') { switch (ch) { case '+': case '-': while (opstack.top != -1) { expStr[t] = opstack.opdata[opstack.top]; opstack.top--; t++; } opstack.top++; opstack.opdata[opstack.top] = ch; break; case '/': while (opstack.top != -1 && (opstack.opdata[opstack.top] =='*' || opstack.opdata[opstack.top] =='/') ) { expStr[t] = opstack.opdata[opstack.top]; opstack.top--; t++; } opstack.top++; opstack.opdata[opstack.top] = ch; break; default: expStr[t] = ch; t++; break; } i++; ch = expStr[i]; } while (opstack.top != -1)//将栈中所有的剩余的运算符出栈 { expStr[t] = opstack.opdata[opstack.top]; opstack.top--; t++; } expStr[t]='\0'; struct { int numeric[200]; int top; }data; data.top = -1; i=0; ch = expStr[i]; while (ch!='\0') { if (ch>='0' && ch <= '9' ) { data.top++; data.numeric[data.top] = ch-'0'; } else if('+' == ch) { int tmp = data.numeric[data.top-1] + data.numeric[data.top]; data.top--; data.numeric[data.top] = tmp; } else if('-' == ch) { int tmp = data.numeric[data.top-1] - data.numeric[data.top]; data.top--; data.numeric[data.top] = tmp; } else if('*' == ch) { int tmp = data.numeric[data.top-1] * data.numeric[data.top]; data.top--; data.numeric[data.top] = tmp; } else if('/' == ch) { if(data.numeric[data.top] == 0) { printf("cannot be zero of the divide\n"); exit(1); } int tmp = data.numeric[data.top-1] / data.numeric[data.top]; data.top--; data.numeric[data.top] = tmp; } i++; ch = expStr[i]; } return data.numeric[data.top]; }
相关文章推荐
- 四则运算
- 大学Java实验一,素数,哥德巴赫猜想,简单的日期类,复数类四则运算
- 动态链接库,创建四则运算
- java中FOR循环实现累加、四则运算
- C++第八周【任务四】分数类中的对象可以和整型数进行四则运算,且运算符合交换律。
- [C++]数据结构实验04:使用堆栈进行简单的四则运算
- java 实现带括号的加减乘除四则运算
- 关于大数的四则运算
- 简单四则运算
- 深入理解计算机系统:信息的处理和表示(二)整数四则运算
- 一个简单的四则运算
- IO-02. 整数四则运算
- 四则运算-jobdu-1101
- 30道四则运算
- 四则运算(2)设计思路
- 四则运算2--c++
- 很简单的C++实现四则运算
- 四则运算
- 全国小学四则运算1.0
- 第八周-运算符重载-分数类中的运算符重载-四则运算