我们人类习惯于书写“中缀式”,如 3 + 5 * 2
,其值为13
。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?)
而计算机更加习惯“后缀式”(也叫“逆波兰式”,Reverse Polish Notation)。上述中缀式对应的后缀式是: 3 5 2 * +
现在,请对输入的后缀式进行求值。
输入格式:
在一行中输入一个后缀式,运算数
和运算符
之间用空格分隔,运算数长度不超过6
位,运算符仅有+ - * /
四种。
输出格式:
在一行中输出后缀式的值,保留一位小数。
输入样例:
3 5.4 2.2 * +
输出样例:
14.9
前提背景:
由于没好好学指针和链表,所以数据结构上面的那个链栈是“亿”点都不会,但是我之前学过stl容器感觉挺方便的,就打算写一篇题解
提示:会用到stod函数,其作用是把字符型转换为浮点型
思路:
就是把每一个“东西”都看成字符串,举个栗子,以上面样例为例,把3看成字符串,把5.4看成字符串,把2.2看成字符串,把*看成字符串,把+看成字符串;然后就读入每个字符串,遇到运算符之类的,如“+、-、*、/”,就把栈中的前两个数取出来,这个操作简单,不必详谈,这里也有个易错点,就是在减或者除法的操作中,需要的是第二个取出的数减或除以第一个取出的数,这个你们自己举个例子试试就清楚了;没有遇到就把字符串转换为浮点型并存到stack栈中;别的没啥了,上代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
stack<double>s;
string st;
while(cin>>st)
{
if(st=="+"||st=="-"||st=="*"||st=="/")
{
double x,y,z;
x=s.top();s.pop();//第一个取出的数
y=s.top();s.pop();//第二个取出的数
if(st=="+")
z=x+y;
else if(st=="-")
z=y-x;//需注意
else if(st=="*")
z=x*y;
else if(st=="/")
z=y/x;//需注意
s.push(z);
}
else
{
double a=stod(st);//字符型转化为浮点型
s.push(a);
}
}
if(!s.empty())
printf("%.1f",s.top());//根据题目要求
return 0;
}
绝对简单,毋庸置疑的O(∩_∩)O哈哈~