华为OJ(四则运算)
2015-08-22 20:32
441 查看
真是怕啥来啥啊,这种题很愁人的,哎,不过还好,刚做过表达式求值,两道题的区别只是增加了中括号和大括号,刚好练练手啦,玩玩没想到,真是太麻烦了,现在只是解决了无负数输入的情况,对示例输入有负数情况还需要修改代码。o(╯□╰)o,放着以后再解决吧。
描述 | 请实现如下接口 /* 功能:四则运算 * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}" * 返回:算术表达式的计算结果 */ public static int calculate(String strExpression) { /* 请实现*/ return 0; } 约束:pucExpression字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。 pucExpression算术表达式的有效性由调用者保证; |
---|---|
知识点 | 栈 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | 输入一个算术表达式 |
输出 | 得到计算结果 |
样例输入 | 3+2*{1+2*[-4/(8-6)+7]} |
样例输出 | 25 |
#include<iostream> #include<string> #include<stack> using namespace std; //运算符的优先关系 //'+', '-', '*', '/', '(', ')','[',']','{','}', '#' char OprRelation[11][11]={{'>', '>', '<', '<', '<', '>', '<','>','<','>', '>'}, //'+' {'>', '>', '<', '<', '<', '>', '<','>','<','>', '>'}, //'-' {'>', '>', '>', '>', '<', '>', '<','>','<','>', '>'}, //'*' {'>', '>', '>', '>', '<', '>', '<','>','<','>', '>'}, //'/' {'<', '<', '<', '<', '<', '=', '<','<','<','<', '>'}, //'(' {'>', '>', '>', '>', '=', '>', '>','>','>','>', '>'}, //')' {'<', '<', '<', '<', '<', '<', '<','=','<','<', '>'}, //'[' {'>', '>', '>', '>', '>', '>', '=','>','>','>', '>'}, //']' {'<', '<', '<', '<', '<', '<', '<','<','<','=', '>'}, //'{' {'>', '>', '>', '>', '>', '>', '=','>','>','>', '>'}, //'}' {'<', '<', '<', '<', '<', '<', '<','<','<','<', '='}};//'#' bool IsOperator(char ch) { if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(' ||ch==')'||ch=='['||ch==']'||ch=='{'||ch=='}'||ch=='#') return true; else return false; } //将运算符转化为数组下标以便进行优先级比较 int ConvertToIndex(char opr) { int index; switch (opr) { case '+': index = 0; break; case '-': index = 1; break; case '*': index = 2; break; case '/': index = 3; break; case '(': index = 4; break; case ')': index = 5; break; case '[': index = 6; break; case ']': index=7; break; case '{': index=8; break; case '}': index=9; break; case '#': index=10; break; } return index; } //运算符优先级比较 char Precede(char opr1, char opr2) { int index1 = ConvertToIndex(opr1); int index2 = ConvertToIndex(opr2); return OprRelation[index1][index2]; } //进行运算符转化 int Operate(int opnd1, char op, int opnd2) { int ret; switch(op) { case '+': ret = opnd1 + opnd2; break; case '-': ret = opnd1 - opnd2; break; case '*': ret = opnd1 * opnd2; break; case '/': ret = opnd1 / opnd2; break; } return ret; } //运算符优先算法 int CaculateExpression(string exp) { stack<char> optr; //只处理+ - # / () [] {}运算 stack<int> opnd; char ch; int i = 0; exp += "#"; optr.push('#'); ch = exp[i++]; //如果##配对,表达式求值完成 while (ch != '#' || optr.top() != '#') { if (!IsOperator(ch)) { //操作数入栈 int a=0; while(!IsOperator(ch)) { a=a*10+ch-'0'; //将String转化为int ch=exp[i++]; } opnd.push(a); } else { //比较栈顶操作符和新取得的操作符的优先关系 switch (Precede(optr.top(), ch)) { case '<'://栈顶优先权低 optr.push(ch); ch = exp[i++]; break; case '='://括号配对,栈顶括号弹出 optr.pop(); ch = exp[i++]; break; case '>'://栈顶优先权高,先弹出,计算,结果操作数入栈 char op = optr.top(); optr.pop(); int num2 = opnd.top();//第二个操作数在前 opnd.pop(); int num1 = opnd.top(); opnd.pop(); int ret = Operate(num1, op, num2); opnd.push(ret); break; } } }//end of while //操作数栈的唯一元素即为计算结果 return opnd.top(); } int main() { char a[1025]; int res; cin>>a; string s=string (a); cout<<CaculateExpression(s); /*int flag=1; for(int i=0;i<s.size();i++) if(!(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='('||s[i]==')'||isdigit(s[i]) ||s[i]=='['||s[i]==']'||s[i]=='{'||s[i]=='}')) { flag=0; break; } if(flag) { res=CaculateExpression(s); cout<<res<<endl; cout<<"true"<<endl; } else cout<<"false"<<endl;*/ system("pause"); return 0; }
相关文章推荐
- Binary Tree Paths
- OC通讯录(字典)
- Android-基本控件(五大布局 Layout)
- canvas.drawArc实现
- 3665 Seaside【floyd】
- 数字8(eight )题解
- poj1936
- ZOJ 3209 Treasure Map (DLX精确覆盖)
- OpenStack点滴积累1--Url映射的实现
- linux终端和控制台
- HDU_1166 敌兵布阵(线段树)
- poj1459
- Search a 2D Matrix II
- 汇编语言学习笔记 第三节:算术运算指令
- 当一个愤青
- USBDM BDM Interface for Freescale Microcontroller -- Firmware
- iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)
- 【shell脚本练习】批量添加用户和设置密码
- 【shell脚本练习】批量添加用户和设置密码
- [Android随笔]内存泄漏以及内存溢出