#include<iostream>
#include<cstdio>
#include<cctype>
#include<string>
#include<stack>
using namespace std;
运算级别规定
int Priority(char c){
if(c=='#'){//最低级别,便于开始的比较
return 0;
}else if(c=='$'){//放到表达式末尾,当只剩下#和$时表达式运算结束
return 1;
}else if(c=='+'||c=='-'){
return 2;
}else{
return 3;
}
}
/*
c++,函数传参:
(1)将变量名作为实参和形参。这时传给形参的是变量的值,
传递是单向的。如果在执行函数期间形参的值发生变
化,并不传回给实参。因为在调用函数时,形参和实参
不是同一个存储单元。//同c
(2) 传递变量的指针。形参是指针变量,实参是一个变量的
地址,调用函数时,形参(指针变量)指向实参变量单元。
这种通过形参指针可以改变实参的值。//同c
(3) C++提供了 传递变量的引用。形参是引用变量,和实参是
一个变量,调用函数时,形参(引用变量)指向实参变量
单元。这种通过形参引用可以改变实参的值。
*/
//isdigit()函数在头文件cctype中,该函数能够用来检查字符是否为十进制数字符
连续数字字符对应的十进制数
double GetNumber(string str,int& index){
double number=0;
while(isdigit(str[index])){
number=number*10+str[index]-'0';
index++;
}
return number;
}
四则运算
double Caculate(double x,double y,char op){
double rs=0;
if(op=='*'){
rs=x*y;
}else if(op=='-'){
rs=x-y;
}else if(op=='+'){
rs=x+y;
}else if(op=='/'){
rs=x/y;
}
return rs;
}
主函数
int main(){
string str;
while(getline(cin,str)){
if(str=="0"){
break;
}
int index=0;//字符串索引
stack<char>oper;
stack<double>data;
str+='$';//尾部加上$,级别次之
oper.push('#');//运算符栈的第一个元素#级别最低
while(index<str.size()) {
if(str[index]==' '){
index++;
}else if(isdigit(str[index])){
data.push(GetNumber(str,index));
}else{
if(Priority(oper.top())<Priority(str[index])){
oper.push(str[index]);
index++;
}else{
double y=data.top();
data.pop();
double x=data.top();
data.pop();
data.push(Caculate(x,y,oper.top()));
oper.pop();
}
}
}
printf("%.2f\n",data.top());
}
return 0;
}