加载中...

后缀表达式(逆波兰表达式)

空格分隔输入格式

递归做法
//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)
后期转换会显得轻松很多
参考
后缀表达式

posted @ 2022-09-21 18:40  biubidio  阅读(54)  评论(0)    收藏  举报