hihocoder1332 简单计算器
来源:互联网 发布:网络安全技术保障方案 编辑:程序博客网 时间:2024/06/08 19:52
- 样例输入
100*(2+12)-(20/3)*2
- 样例输出
1388
描述
编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整。)
例如计算 100 * ( 2 + 12 ) - (20 / 3) * 2, 结果是1388。
输入
一个长度不超过100的字符串,代表要计算的算式。包含数字0-9以及+-*/()。
输入保证计算过程不会超过32位有符号整数,并且其中的'-'都是减号没有负号。
输出
计算的结果。
解题思路:运用栈的知识,和分治的思想来模拟,先把中缀表达式转化为后缀表达式(即逆波兰式)然后用栈进行计算。
具体看代码吧:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<string>#include<stack>using namespace std;int getrink(char opt){ if(opt == '+' || opt == '-') return 10; if(opt == '*' || opt == '/') return 20; if(opt == '(') return 0; else return -1;}int postfix(string &str_post,string &str_mid){ stack<char> opt; while(!opt.empty()) opt.pop(); bool flag=false; for(int i=0; str_mid[i]!='\0'; i++) { if(str_mid[i]>='0'&&str_mid[i]<='9') { if(flag) { str_post+='&'; } else { flag=true; } while(str_mid[i]>='0'&&str_mid[i]<='9') { str_post+=str_mid[i]; i++; } i--; } else if(str_mid[i]=='(') { opt.push(str_mid[i]); } else if(str_mid[i]==')') { if(!opt.empty()&&opt.top()!='(') { str_post+=opt.top(); opt.pop(); flag=false; } if(opt.top()=='(') { opt.pop(); } } else if(str_mid[i]=='+'||str_mid[i]=='-'||str_mid[i]=='*'||str_mid[i]=='/') { int a1=getrink(str_mid[i]); int a2; while(!opt.empty()) { a2=getrink(opt.top()); if(a1<=a2) { str_post+=opt.top(); opt.pop(); flag=false; } else{break;} } opt.push(str_mid[i]); } } while(!opt.empty()){str_post+=opt.top();opt.pop();}}int getresult(int a,int b,char opp){if(opp=='+') return a+b;if(opp=='-') return a-b;if(opp=='*') return a*b;if(opp=='/') return a/b;}int compute(string str){int op1,op2,temp;stack<int> data;while(!data.empty()) data.pop();for(int i=0;str[i]!='\0';i++){if(str[i]=='&') continue;else if(str[i]>='0'&&str[i]<='9'){temp=0;while(str[i]>='0'&&str[i]<='9'){temp=temp*10+str[i]-'0';i++;}i--;data.push(temp);}else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){op1=data.top();data.pop();op2=data.top();data.pop();temp=getresult(op2,op1,str[i]);data.push(temp);}}return data.top();}int main(){string str_mid,str_post;while(cin>>str_mid){postfix(str_post,str_mid); cout << str_post << endl;cout<<compute(str_post)<<endl;}return 0;}
人一我十,人百我万。
阅读全文
0 0
- hihocoder1332 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 简单计算器
- 水仙花数
- CentOS6.x一键部署安装zabbix
- android activity设置透明或者半透明背景
- MyBatis框架实现分页功能
- [人脸识别]使用VGG Face Model对一张图片进行测试
- hihocoder1332 简单计算器
- Android Ethernet以太网使用静态IP
- 排序算法—选择排序
- 如何通过Mysql的二进制日志恢复数据库数据
- Zyoung
- 内容提供者——读取短信
- C语言宏定义和函数的异同
- Json工具类--使用2.x版本的Jackson实现了Json的序列化和反序列化
- 两数之和