后缀表达式(逆波兰表达式)
空格分隔输入格式
递归做法
//3 5 2 - * 7 +
#include<iostream>
using namespace std;
string s[105];
int bolan(int &i){
if(s[i][0]>='0'&&s[i][0]<='9'){
return atof(s[i].c_str());
}
else{
if(s[i][0]=='+'){
int x=bolan(--i),y=bolan(--i);
return y+x;
}
if(s[i][0]=='-'){
int x=bolan(--i),y=bolan(--i);
return y-x;
}
if(s[i][0]=='*'){
int x=bolan(--i),y=bolan(--i);
return y*x;
}
if(s[i][0]=='/'){
int x=bolan(--i),y=bolan(--i);
return y/x;
}
}
}
int main()
{
int n=0;
while(cin>>s[n++])
{
if(cin.get()=='\n')break;
}
n=n-1;
cout<<bolan(n)<<endl;
}
参考:
atof(),atoi(),itoa()和stoi(),c_str()函数的用法
int a = atoi(str1.c_str());
也可以转换负整数
将bolan()函数及其内部返回值都设为浮点数类型后,就可以对浮点数进行同样计算啦
注意
(1)i的取值,判断类型时一定取该字符串元素的第一位
(2)cin和cin.get()的使用
如图,共七次进入循环读入,前六次cin.get()读入的是空格,最后一次读入的是回车符,进入if,跳出循环
如果是以@结束
//3 5 2 - * 7.2 + @
则更改主函数为
int main()
{
int n=0;
while(cin>>s[n++])
{
//if(cin.get()=='\n')break;
if(s[n-1]=="@") break;
}
n=n-2;
cout<<bolan(n)<<endl;
}
相当于八次读入,前七次都读入空格,最后一次读入‘@’,所以n-2。
以点号.(特殊符号)分隔
.标志数字录入完毕
@标志输入结束
//3.5.2.-*7.+@
显然不能对浮点数操作
看成树的话,只能明确右子树和节点操作符,左子树作为一个整体,也是一个完整的后缀表达式,递归
用栈一次性读入所有的字符
(尝试在前期就进行数字和操作符的区分,失败了 orz)
后期转换会显得轻松很多
参考
后缀表达式