逆波兰式(可以输入小数)
#include<iostream>
#include<string>
using namespace std;
#include<stack>
void rpn(){
string str;
char c;
char data[20];
bool flag = true;;
stack<double> d1;
while (true)
{
double a, b, d;
cout << "请输入一个只包含加、减、乘、除和数字的逆波兰表达式(以空格间隔):" << endl;
getline(cin, str);
//cout << str << endl;
int len = str.length();
//cout << len << endl;
int j = 0;
if (str[0] == '.'){
cout << "你输入的不是逆波兰式!请重新输入。" << endl;
continue;
}
for (int i = 0; i<len; i++){
//字符接受单个字符串
c = str[i];
//cout << c << endl;
if (isdigit(c) || c == '.'){
data[j++] = c;
data[j] = '\0';
}
if (c == ' '&&j>0){
d = atof(data);
d1.push(d);
j = 0;
}
switch (c){
case '+':
if(d1.size() >= 2){
a = d1.top();
d1.pop();
b = d1.top();
d1.pop();
d = b + a;
d1.push(d);
flag = true;
}
else{
flag = false;
}
break;
case '-':
if (d1.size() >= 2){
a = d1.top();
d1.pop();
b = d1.top();
d1.pop();
d = b - a;
d1.push(d);
flag = true;
}
else{
flag = false;
}
break;
case '*':
if (d1.size() >= 2){
a = d1.top();
d1.pop();
b = d1.top();
d1.pop();
d = a * b;
d1.push(d);
flag = true;
}
else{
flag = false;
}
break;
case '/':
if (d1.size() >= 2){
a = d1.top();
d1.pop();
b = d1.top();
d1.pop();
if (a == 0){
cout << "除数为0!错误" << endl;
break;
}
d = b / a;
d1.push(d);
flag = true;
}
else{
flag = false;
}
break;
}
}
if (flag&&d1.size() == 1){
cout << "最后的值为:" << d<< endl;
}
else{
cout << "你输入的不是逆波兰式!请重新输入。" << endl;
}
while (!d1.empty())
{
d1.pop();
}
}
}
int main(){
rpn();
system("pause");
return 0;
}