前缀表达式是一种数学表达式的表示方法,其中运算符位于操作数之前 。它也被称为波兰表达式(Polish Notation),例如:+ 5 4 变成中缀表达式是 5 + 4,* + 2 3 4 变成中缀表达式是 4 * (2 + 3)。
前缀表达式求值的方式和后缀表达式十分类似,前缀表达式可以和后缀表达式互相转换。
从右向左遍历前缀表达式 如果是数字就压栈,是空格就跳过,是符号就弹出栈顶的两个数,对这两个数进行运算,把结果压入栈中就可以了。
例如 + 5 4,4 压栈,空格跳过,5压栈,空格跳过,+号,就将5、4出栈,将5 + 4 的结果压栈,所以结果是9。
题目:波兰表达式
【题目描述】
波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式
2 + 3
的波兰表示法为+ 2 3
。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4
的波兰表示法为* + 2 3 4
。本题求解波兰表达式的值,其中运算符包括+ - * /
四个。【输入】
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
【输出】
输出为一行,表达式的值。
可直接用
printf("%f\n", v)
输出表达式的值v。【输入样例】
* + 11.0 12.0 + 24.0 35.0
【输出样例】
1357.000000
思路
思路在前边,可是题目中的是浮点数,其中有着 '.' 这个符号,该如何储存,例如把5.15存储,数位为0,那就先把5 * 10 ^(0)加到res中去,数位为1,那就把 1 * 10 ^(1) 加到res中,遇到了 '.' ,所以要将res(15)变成小数,为0.15,遇到了 5 ,就把5 * 10 ^(0)加到res中,得到了res = 5.15。
需要定义一个变量来表示数位 --- wei
代码
#include <iostream>
#include <string>
using namespace std;
float stk[100]; // 数组模拟栈
int tt;
int main(void)
{
string arr;
getline(cin, arr);
float res = 0.; // 存储着要入栈的数
for (int i = arr.size() - 1; i >= 0; i--)
{
if (arr[i] == ' ')
{
;
}
else if (arr[i] == '+')
{
stk[tt - 1] = stk[tt] + stk[tt - 1];
tt--;
}
else if (arr[i] == '-')
{
stk[tt - 1] = stk[tt] - stk[tt - 1];
tt--;
}
else if (arr[i] == '*')
{
stk[tt - 1] = stk[tt] * stk[tt - 1];
tt--;
}
else if (arr[i] == '/')
{
stk[tt - 1] = stk[tt] / stk[tt - 1];
tt--;
}
else
{
int wei = 0; // 代表这个数该乘以10的几次方
while (arr[i] != ' ')
{
if (arr[i] == '.')
{
wei = 0; //重新赋为0,因为下一位是个位
while (res > 1) //将res变成小数点后的数
{
res /= 10;
}
i-- ;
}
else
{
int temp = arr[i] - '0';
for (int i = 0; i < wei; i++)
{
temp *= 10;
}
res += temp;
i--;
wei++;
}
}
stk[++tt] = res;
res = 0. ;
}
}
printf("%f\n", stk[tt]);
return 0;
}