简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30283 Accepted Submission(s): 10981
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
Source
数据结构中的表达式求值问题。
经典做法是使用两个栈,一个运算符栈,一个操作数栈。具体思路为:扫描一遍输入,若为操作数,则直接压人操作数栈;若为运算符,判断当前栈顶运算符与当前扫描的运算符的优先级大小,若当前栈顶运算符优先级高于当前扫描的运算符,只需要进行运算,从操作数栈中弹出两个操作数a,b,与该运算符运算(注意运算顺序),并将运算结果压入操作数栈。最终操作数栈中只有一个最终结果。
代码如下:
#include <cstdio>
#include <iostream>
#include <string.h>
#include <stack>
using namespace std;
stack<double> num;
stack<char> oper;
char str[205];
inline double compute(char op,double a,double b)
{
switch(op)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
}
inline bool priority(char op1,char op2)
{
if(op1=='#') return op2=='#';
else if(op1=='+'||op1=='-') return op2=='+'||op2=='-'||op2=='#';
else if(op1=='*'||op1=='/') return true;
}
inline bool is_num(char ch)
{
return ch>='0'&&ch<='9';
}
int main()
{
while(cin.getline(str,205))
{
int len=strlen(str);
if(len==1&&str[0]=='0') break;
str[len]='#';
oper.push('#');
for(int i=0;i<=len;i++)
{
if(str[i]==' ') continue;
if(is_num(str[i]))
{
double f=0;
while(is_num(str[i]))
{
f=f*10+str[i]-'0';
i++;
}
i--;
num.push(f);
}
else
{
while(priority(oper.top(),str[i]))
{
if(str[i]=='#'&&oper.top()=='#') break;
double a=num.top();num.pop();
double b=num.top();num.pop();
num.push(compute(oper.top(),b,a));
oper.pop();
}
oper.push(str[i]);
}
}
printf("%.2lf\n",num.top());
while(!num.empty()) num.pop();
while(!oper.empty()) oper.pop();
}
}
还有一种直接模拟比较简单。
#include <cstdio>
double num[205];
double d;
char ch;
int main()
{
while(~scanf("%lf",&d))
{
int i=0;
num[i]=d;
while(true)
{
if(getchar()=='\n') break;
scanf("%c%lf",&ch,&d);
if(ch=='*') num[i]*=d;
else if(ch=='/') num[i]/=d;
else if(ch=='+') num[++i]=d;
else num[++i]=-d;
}
if(i==0&&d==0) break;
double sum=0;
while(i>=0) sum+=num[i--];
printf("%.2lf\n",sum);
}
}