华为2012校招成都站8:00最后一题,表达式计算源代码
2012-09-15 14:24
267 查看
主要是数字可能是多位数,需要处理!本程序没有做异常处理,要求表达式串正确!
其中有两个内部循环代码是重复的,最好写成一个函数,这里就不改了
转载 请保留链接 http://blog.csdn.net/challenge_c_plusplus/article/details/7982076
其中有两个内部循环代码是重复的,最好写成一个函数,这里就不改了
转载 请保留链接 http://blog.csdn.net/challenge_c_plusplus/article/details/7982076
/*表达式计算-华为校招 Author : Milo.Wang Date : 2012/9/15 */ #include <iostream> #include <cstring> using namespace std; void Expr(const char *expr, int *ret) { char expr1[1024]; char expr2[1024]; strcpy(expr1,expr); strcpy(expr2,expr); int opds[1024]; char oprs[1024]; int idxd = 0, idxr = 0; int opd_idx = -1; char * p = strtok(expr1,"()*+-"); while(p != NULL) { opds[idxd++] = atoi(p); p = strtok(NULL,"()*+-"); } int i; int digit_flag = true; for(i = 0; expr2[i] != '\0'; ++i) { switch(expr2[i]) { case '(': case ')': case '+': case '-': case '*': digit_flag = true; oprs[idxr++] = expr2[i]; break; default: if(digit_flag) { digit_flag = false; oprs[idxr++] = '#';//特殊符号,标示有一个数字 } } } oprs[idxr++] = '\0'; int opd_stack[1024]; char opr_stack[1024]; int opd_top = -1; int opr_top = -1; int opdr,opdl; for(i = 0; i < idxr; ++i) { char ch; switch((ch = oprs[i])) { case '*': case '(': opr_stack[++opr_top] = ch; break; case '+': case '-': while(opr_top > -1 && opr_stack[opr_top] == '*') { --opr_top; opdr = opd_stack[opd_top--]; opdl = opd_stack[opd_top--]; opd_stack[++opd_top] = opdl * opdr; } opr_stack[++opr_top] = ch; break; case ')': while(opr_top > -1 && opr_stack[opr_top] != '(') { opdr = opd_stack[opd_top--]; opdl = opd_stack[opd_top--]; char c; int result; switch((c = opr_stack[opr_top--])) { case '*': result = opdl * opdr; break; case '+': result = opdl + opdr; break; case '-': result = opdl - opdr; break; } opd_stack[++opd_top] = result; } if(opr_stack[opr_top] == '(') --opr_top; break; case '\0': while(opr_top > -1) { opdr = opd_stack[opd_top--]; opdl = opd_stack[opd_top--]; char c; int result; switch((c = opr_stack[opr_top--])) { case '*': result = opdl * opdr; break; case '+': result = opdl + opdr; break; case '-': result = opdl - opdr; break; } opd_stack[++opd_top] = result; } break; case '#': opd_stack[++opd_top] = opds[++opd_idx]; } } *ret = opd_stack[opd_top]; } int main(int argc, char *argv[]) { const char *str = "5+6*(5-2)-10"; int ret; Expr(str,&ret); cout << str << " = " << ret << endl; return 0; }
相关文章推荐
- 华为机试题:有10个整数,使前面格数顺序向后移m个位置,最后m个数变成最前面m个数。计算移动后的整数序列的前m个数和后m个数的和。
- 华为机试——计算整数二进制表达式中0的个数
- 字符串四则运算表达式的计算(华为机试)
- 华为2013校园招聘上机笔试题-计算整数二进制表达式中0的个数
- 2014华为机试题---表达式计算
- 2012华为招聘上机题——————大数相乘简化计算
- 华为上机练习题--简单加减表达式计算
- 华为机试题--计算一个表达式的值
- 华为2012秋季校招机试题-选秀节目打分(题目来自网络)
- 华为机试:计算一个表达式的值
- 华为2012秋季校招机试题-数组处理(题目源自网络)
- 华为机试 计算加减乘除数学表达式的结果
- 华为2012秋季校招机试题-数组奇偶交叉重组(题目源自网络)
- 字符串四则运算表达式的计算(华为机试)
- C-源代码-计算简单表达式
- 2012华为校招上机一道----字符串分离
- 【C编程练习】2013华为校园招聘机试题9月10日题2:计算整数二进制表达式中0的个数 最左边1前面的0不考虑 void GenZeroNum(int nVal, int& nZeroNum);
- 字符串四则运算表达式的计算(华为机试)
- 计算表达式(栈)
- 计算重复字符个数_华为SO挑战赛试题2015年8月