链接:https://www.nowcoder.com/questionTerminal/5759c29a28cb4361bc3605979d5a6130
来源:牛客网
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入描述:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出描述:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
示例1
输入
1 + 2 4 + 2 * 5 - 7 / 11 0
输出
3.00 13.36
#include<iostream>
#include<cstdio>
#include<stack>
#include<cctype>
using namespace std;
#define MAXSIZE 201
stack<double> digit;//存放运算数
stack<char> op;//存放运算符
int readnum(char str[],int i){//获取数字函数
double res=0;
while(str[i]!=' ' && str[i]!='\0'){
res=res*10+(str[i++]-'0');
}
return res;
}
double calculator(char str[]){//计算函数
int i,pre=-1;
char c;
for(i=0;i<strlen(str);i++){
if(isdigit(str[i])){//判断字符为数字
double num=readnum(str,i);
if(pre==-1){
digit.push(num);
}else{
if(c=='*'){
digit.push(num*pre);
}else{
digit.push(pre/num);
}
c='#';
pre=-1;
}
while(str[i]!=' '&&str[i]!='\0')
if(i<strlen(str)) i++;
}
if(str[i]=='+'||str[i]=='-'){//加减号
op.push(str[i]);
}
if(str[i]=='*'||str[i]=='/'){//乘除号
pre=digit.top();
digit.pop();
c=str[i];
}
if(str[i]=='\0'){
while(!op.empty()){
double n1=digit.top();
digit.pop();
double n2=digit.top();
digit.pop();
if(op.top()=='+'){
digit.push(n1+n2);
}else{
digit.push(n2-n1);
}
op.pop();
}
}
}
double res=digit.top();
digit.pop();
return res;
}
int main(){
char buf[MAXSIZE];
while(gets(buf)){//4 + 2 * 5 - 7 / 11 思想将加减入栈,乘除运算后将结果入栈
if(strcmp(buf,"0")==0) break;
double res=calculator(buf);
printf("%.2f\n",res);
}
return 0;
}