HDU 1237 简单计算器(栈)
来源:互联网 发布:网络诈骗揭秘 编辑:程序博客网 时间:2024/06/06 06:53
简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14816 Accepted Submission(s): 5038
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 24 + 2 * 5 - 7 / 110
Sample Output
3.0013.36
首先处理输入的字符串,拆分成操作数和操作符。然后把操作数和对应的操作符(只能为'+'和'-')依次压栈,如果遇到对应的操作符为'*'或'/',则弹出栈顶元素与当前数进行乘除,再把结果压栈。这样一轮操作下来,操作符就只剩下'+'和'-',最后把操作数栈和操作符栈的元素弹出计算。
#include<stack>#include<queue>#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=200+10;double ans,Num[MAXN];char str[MAXN],Ope[MAXN];int isNum(char s){ if(s>='0'&&s<='9') return 1; return 0;}int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);#endif // ONLINE_JUDGE while(1) { gets(str); if(strcmp(str,"0")==0) break; memset(Num,0,sizeof(Num)); memset(Ope,0,sizeof(Ope)); int num=0,numcnt=0,opecnt=0; for(int i=0;str[i];i++)//拆分字符串 { if(i==0||(str[i-1]==' '&&isNum(str[i]))) num=str[i]-'0'; if(i>0&&isNum(str[i])&&isNum(str[i-1])) num=num*10+str[i]-'0'; if(str[i]==' '&&isNum(str[i-1])) { Num[numcnt++]=num; num=0; } if(str[i]=='+'||str[i]=='/'||str[i]=='*'||str[i]=='-') { Ope[opecnt++]=str[i]; } } Num[numcnt++]=num; stack<double>s; stack<char>oper; s.push(Num[0]); for(int i=0;i<opecnt;i++) { double temp; if(Ope[i]=='+') { s.push(Num[i+1]); oper.push(Ope[i]); } else if(Ope[i]=='-') { s.push(Num[i+1]); oper.push(Ope[i]); } else if(Ope[i]=='*') { temp=s.top(); s.pop(); temp*=Num[i+1]; s.push(temp); } else { temp=s.top(); s.pop(); temp/=Num[i+1]; s.push(temp); } } stack<double>ts; stack<char>toper; while(!s.empty()) { double temp=s.top(); s.pop(); ts.push(temp); } while(!oper.empty()) { char temp=oper.top(); oper.pop(); toper.push(temp); } ans=ts.top(); ts.pop(); while(!toper.empty()) { char temp=toper.top(); toper.pop(); double tem=ts.top(); ts.pop(); if(temp=='+') ans+=tem; else ans-=tem; } printf("%.2lf\n",ans); } return 0;}
1 0
- hdu 1237 简单计算器 栈
- HDU 1237 简单计算器(栈)
- HDU 1237:简单计算器【栈】
- HDU - 1237 - 简单计算器(栈)
- HDU-1237 简单计算器【栈】
- HDU 1237 简单计算器
- HDU 1237 简单计算器
- hdu 1237 简单计算器
- HDU 1237 简单计算器
- hdu 1237 简单计算器
- hdu 1237 简单计算器
- hdu - 1237 - 简单计算器
- hdu 1237 简单计算器
- HDU-简单计算器-1237
- hdu 1237简单计算器
- hdu 1237 简单计算器
- hdu 1237 简单计算器
- HDU 1237 简单计算器
- 可数集合与不可数集合
- Rotate Image
- λ演算
- JAVA线程中ThreadLocal和volatile的说明
- HDU水题 统计元音
- HDU 1237 简单计算器(栈)
- N的M次方最右边的数字
- 程序员必读书单 1.0
- POJ 1068 Parencodings(暴力枚举)
- 对角化原理和停机问题
- POJ 1315 Don't Get Rooked(DFS)
- ATT汇编
- Cognos报表参数值保存到Excel
- Linux-config-prefix